Подтвердить что ты не робот

Почему я получаю "Маршрут с именем" swagger_docs "уже находится в коллекции маршрутов" после публикации моего приложения API?

После публикации моего приложения API я получаю желтый экран ошибок ASP.NET. В сообщении об ошибке говорится: "Маршрут с именем" swagger_docs "уже находится в коллекции маршрутов".

Как я могу это исправить?

4b9b3361

Ответ 1

Это не относится к API-приложениям как таковым, а больше относится к веб-API. Что вызывает ошибку довольно просто:

  • Вы публикуете приложение API, основанное на веб-API.
  • Вы отбрасываете свой проект и начинаете работу над новым API-приложением на основе веб-API
  • Вы хотите опубликовать новое приложение API вместо старого приложения API, созданного на шаге 1.
  • Вы выбираете приложение API во время "Опубликовать..", и вы получаете профиль публикации существующего приложения API, которое мы развернули на шаге 1.
  • Развертывание выполняется с помощью Web Deploy и профиля публикации, нового приложения API поверх старого.

Это вызовет проблему, о которой я рассказывал ранее. Это происходит потому, что при попытке запустить приложение есть два маршрута, зарегистрированные Swashbuckle. Один из старых и один из нового. Это потому, что старые файлы все еще присутствуют в пункте назначения.

Чтобы решить эту проблему, во время веб-развертывания перейдите на вкладку "Параметры", а затем разверните "Параметры публикации файла". Там есть флажок "Удалить дополнительные файлы из пункта назначения". Это устранит проблему, поскольку она оставит только файлы, которые вы развертываете в пункте назначения, а не старые.

Settings -> File Publish Options

Надеюсь, что это поможет.

Ответ 2

Что делать, если при попытке отладки приложения локально? Это произошло для меня, и причина в том, что я переименовал имя моей сборки. Таким образом, папка bin имела две библиотеки DLL для одного и того же проекта с разными именами, которые вызвали эту ошибку. Как только я удалил старую названную dll, все хорошо. Надеюсь, это поможет.

Ответ 3

Это происходит потому, что вы, вероятно, настраиваете маршрут в классе класса и класса 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.

Он должен работать.

Ответ 4

Альтернативная причина этой проблемы:

Похоже, что многие люди решили эту проблему, удалив свои папки bin и obj согласно другим ответам.

Однако причиной проблемы может быть то, что вы конфигурируете свой Swagger Config в проекте, на который есть ссылка, согласно этому комментарию: https://github.com/domaindrivendev/Swashbuckle/issues/364#issuecomment-226013593

Я получил эту ошибку, когда один проект с Swagger ссылался на другой проект с Swagger. Удаление ссылки решило проблему.

Это заставило меня разделить некоторые основные функциональные возможности на третий проект, на который могли ссылаться оба моих API, вместо того, чтобы ссылаться друг на друга.

Ответ 5

Моя проблема заключалась в том, что я ссылался на другой проект с расширением Swashbuckle. Вот как я сохранил оба проекта, не меняя ничего в проекте, на который ссылались:

  1. Удалите маршруты, созданные в проекте, указанном в 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();
  1. Затем приложение сможет запуститься, но вы увидите операции/функции, которые есть в обоих проектах. Чтобы удалить операции из проекта, на который есть ссылка...

    1. Создайте следующий класс

      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);
                  }
              }
          }
      }
      
    2. И добавьте следующее в SwaggerConfig.cs> Register> GlobalConfiguration.Configuration.EnableSwagger(...)
      c.DocumentFilter<SwaggerCustomOperationsFilter>();