После публикации моего приложения API я получаю желтый экран ошибок ASP.NET. В сообщении об ошибке говорится: "Маршрут с именем" swagger_docs "уже находится в коллекции маршрутов".
Как я могу это исправить?
После публикации моего приложения API я получаю желтый экран ошибок ASP.NET. В сообщении об ошибке говорится: "Маршрут с именем" swagger_docs "уже находится в коллекции маршрутов".
Как я могу это исправить?
Это не относится к API-приложениям как таковым, а больше относится к веб-API. Что вызывает ошибку довольно просто:
Это вызовет проблему, о которой я рассказывал ранее. Это происходит потому, что при попытке запустить приложение есть два маршрута, зарегистрированные Swashbuckle. Один из старых и один из нового. Это потому, что старые файлы все еще присутствуют в пункте назначения.
Чтобы решить эту проблему, во время веб-развертывания перейдите на вкладку "Параметры", а затем разверните "Параметры публикации файла". Там есть флажок "Удалить дополнительные файлы из пункта назначения". Это устранит проблему, поскольку она оставит только файлы, которые вы развертываете в пункте назначения, а не старые.
Надеюсь, что это поможет.
Что делать, если при попытке отладки приложения локально? Это произошло для меня, и причина в том, что я переименовал имя моей сборки. Таким образом, папка bin имела две библиотеки DLL для одного и того же проекта с разными именами, которые вызвали эту ошибку. Как только я удалил старую названную dll, все хорошо. Надеюсь, это поможет.
Это происходит потому, что вы, вероятно, настраиваете маршрут в классе класса и класса WebApiConfig класса SwaggerConfig, как описано ниже:
Файл WebApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
SwaggerConfig.Register();
}
}
Файл SwaggerConfig:
using Swashbuckle.Application;
[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]
namespace NEOH.Api
{
public class SwaggerConfig
{
public static void Register()
{
Что вам нужно сделать, это удалить вызов сборки в файле SwaggerConfig.
Он должен работать.
Альтернативная причина этой проблемы:
Похоже, что многие люди решили эту проблему, удалив свои папки bin и obj согласно другим ответам.
Однако причиной проблемы может быть то, что вы конфигурируете свой Swagger Config в проекте, на который есть ссылка, согласно этому комментарию: https://github.com/domaindrivendev/Swashbuckle/issues/364#issuecomment-226013593
Я получил эту ошибку, когда один проект с Swagger ссылался на другой проект с Swagger. Удаление ссылки решило проблему.
Это заставило меня разделить некоторые основные функциональные возможности на третий проект, на который могли ссылаться оба моих API, вместо того, чтобы ссылаться друг на друга.
Моя проблема заключалась в том, что я ссылался на другой проект с расширением Swashbuckle. Вот как я сохранил оба проекта, не меняя ничего в проекте, на который ссылались:
SwaggerConfig.cs
> Register
, прямо перед GlobalConfiguration.Configuration.EnableSwagger(...).EnableSwaggerUi(...);
:// Clears the previous routes as this solution references another Swagger ASP.NET project which adds the swagger routes.
// Trying to add the Swagger routes more than once will prevent the application from starting
GlobalConfiguration.Configuration.Routes.Clear();
Затем приложение сможет запуститься, но вы увидите операции/функции, которые есть в обоих проектах. Чтобы удалить операции из проекта, на который есть ссылка...
Создайте следующий класс
using Swashbuckle.Swagger;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Description;
namespace yournamespace.Models
{
/// <summary>
/// This class allows to manage the Swagger document filters.
/// </summary>
public class SwaggerCustomOperationsFilter : IDocumentFilter
{
/// <summary>
/// Applies the Swagger operation filter to exclude the Swagger operations/functions
/// that are inherited by the other Swagger projects referenced.
/// </summary>
///
/// <param name="p_swaggerDoc">Swagger document</param>
/// <param name="p_schemaRegistry">Swagger schema registry</param>
/// <param name="p_apiExplorer">Api description collection</param>
public void Apply(SwaggerDocument p_swaggerDoc, SchemaRegistry p_schemaRegistry, IApiExplorer p_apiExplorer)
{
IEnumerable<ApiDescription> externalApiDescriptions = p_apiExplorer.ApiDescriptions
.Where(d => d.ActionDescriptor.ControllerDescriptor.ControllerType.Module.Name != GetType().Module.Name);
IEnumerable<int> externalApiDescriptionIndexes = externalApiDescriptions
.Select(d => p_apiExplorer.ApiDescriptions.IndexOf(d))
.OrderByDescending(i => i);
IEnumerable<string> externalPaths = externalApiDescriptions.Select(d => $"/{d.RelativePathSansQueryString()}");
foreach (string path in externalPaths)
{
p_swaggerDoc.paths.Remove(path);
}
foreach (int apiDescriptionIndex in externalApiDescriptionIndexes)
{
p_apiExplorer.ApiDescriptions.RemoveAt(apiDescriptionIndex);
}
}
}
}
SwaggerConfig.cs
> Register
> GlobalConfiguration.Configuration.EnableSwagger(...)
c.DocumentFilter<SwaggerCustomOperationsFilter>();