为什么我会得到"一条名为' swagger_docs'已经在路线集合"我发布API应用程序后?

时间:2015-04-03 21:10:49

标签: azure asp.net-web-api azure-web-sites

发布我的API应用程序后,我收到了ASP.NET的黄色错误屏幕。错误消息显示“名为'swagger_docs'的路径已经在路径集合中”。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:37)

这与API应用程序本身无关,但与Web API有关。触发错误的原因非常简单:

  1. 您发布了基于Web API的API应用程序。
  2. 您放弃了项目并开始使用基于Web API的新API应用程序
  3. 您希望发布新的API应用程序,而不是您在步骤1中创建的旧API应用程序。
  4. 您在“发布...”期间选择了API应用,并获得了我们在步骤1中部署的现有API应用的发布配置文件。
  5. 您使用Web Deploy和发布配置文件进行部署,新API应用程序位于旧版本之上。
  6. 这将触发我之前解释过的问题。这是因为当您尝试启动应用程序时,Swashbuckle会注册两条路由。旧的一个和新的一个。那是因为旧文件仍然存在于目的地。

    要解决此问题,请在Web部署期间单击“设置”选项卡,然后展开“文件发布选项”。那里有一个复选框,名为“从目的地删除其他文件”。这将解决问题,因为它只会将您部署的文件保留在目的地而不是旧文件。

    Settings -> File Publish Options

    希望它有所帮助。

答案 1 :(得分:9)

尝试在本地调试应用时会发生什么? 这件事发生在我身上,原因是,我改名为我的集会名称。所以bin文件夹有两个dll用于同一项目,具有不同的名称导致此错误。一旦我删除了旧的名为dll一切都很好。希望这会有所帮助。

答案 2 :(得分:3)

这是因为您可能正在WebApiConfig类 SwaggerConfig类中配置路由,如下所述:

WebApiConfig 文件:

$("#select option").on('click',function(){}); //won't work!
$(".option-class").on('click',function(){}); //won't work!
<option ... onclick="myFunc()" value="blah">blah</option> //won't work!

SwaggerConfig 文件:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        SwaggerConfig.Register();
    }
}

您应该删除 SwaggerConfig 文件上的程序集调用。

它应该有用。

答案 3 :(得分:1)

我的解决方案和原因:
重命名NamesSpaces,Refactored等时,我遇到了同样的问题。
阅读其他人做过的事情之后,这就是我尝试过的事情:

  • 在Visual Studio中清洁了解决方案
  • 手动清除Bin文件夹
  • 检查项目属性中的名称空间(以防万一,请复制它)>> Build 标签>>向下滚动至 Output 并确保 XML文档文件是正确的。以后您将需要此名称。
  • 打开:SwaggerConfig.cs >>修复了此处的名称空间(复制,粘贴) c.SingleApiVersion (“ vX”,“ NameSpace”)
  • 向下滚动,直到找到: GetXmlCommentsPath ()复制并粘贴了.xml文件路径中的正确名称空间。
  • 冉,抽烟了,完成了这篇文章。

答案 4 :(得分:0)

此问题的替代原因:

似乎很多人都可以通过删除其他答案中的“ bin”和“ obj”文件夹来解决此问题。

但是,导致此问题的原因可能是,您正在根据以下注释在引用的项目中配置Swagger Config:https://github.com/domaindrivendev/Swashbuckle/issues/364#issuecomment-226013593

  

当一个带有Swagger的项目引用另一个项目时,我收到此错误   Swagger项目。删除参考文献可以解决问题。

这导致我将一些核心功能拆分到第三个项目中,我的两个API都可以引用该项目,而不是相互引用。

答案 5 :(得分:0)

我的问题是我正在引用另一个具有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>();