发布我的API应用程序后,我收到了ASP.NET的黄色错误屏幕。错误消息显示“名为'swagger_docs'的路径已经在路径集合中”。
我该如何解决这个问题?
答案 0 :(得分:37)
这与API应用程序本身无关,但与Web API有关。触发错误的原因非常简单:
这将触发我之前解释过的问题。这是因为当您尝试启动应用程序时,Swashbuckle会注册两条路由。旧的一个和新的一个。那是因为旧文件仍然存在于目的地。
要解决此问题,请在Web部署期间单击“设置”选项卡,然后展开“文件发布选项”。那里有一个复选框,名为“从目的地删除其他文件”。这将解决问题,因为它只会将您部署的文件保留在目的地而不是旧文件。
希望它有所帮助。
答案 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等时,我遇到了同样的问题。
阅读其他人做过的事情之后,这就是我尝试过的事情:
答案 4 :(得分:0)
此问题的替代原因:
似乎很多人都可以通过删除其他答案中的“ bin”和“ obj”文件夹来解决此问题。
但是,导致此问题的原因可能是,您正在根据以下注释在引用的项目中配置Swagger Config:https://github.com/domaindrivendev/Swashbuckle/issues/364#issuecomment-226013593
当一个带有Swagger的项目引用另一个项目时,我收到此错误 Swagger项目。删除参考文献可以解决问题。
这导致我将一些核心功能拆分到第三个项目中,我的两个API都可以引用该项目,而不是相互引用。
答案 5 :(得分:0)
我的问题是我正在引用另一个具有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>();