asp.net - web-api 和 swagger 文档

标签 asp.net asp.net-web-api documentation swagger

我已经编写了一个 asp web-api 并且我已经使用 this class 向 api 添加了版本控制.

我的路线如下所示:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{namespace}/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config));

所以我可以访问 https://localhost:44301/v1/test
我现在正在尝试添加 Swagger 来生成一些 api 文档(实际上我正在使用 Swashbuckle Nuget 包)

当我浏览到 /swagger页面加载但出现所有 Controller 的错误:
Unable to read api 'TestController' from path https://localhost:44301/swagger/api-docs/TestController (server returned undefined)

如果我浏览到 https://localhost:44301/swagger/api-docs/TestController它想出了一个 NullReferenceException堆栈跟踪:
at Swashbuckle.Swagger.OperationGenerator.CreateParameter(ApiParameterDescription apiParamDesc, String apiPath)
   at Swashbuckle.Swagger.OperationGenerator.<>c__DisplayClass2.<ApiDescriptionToOperation>b__1(ApiParameterDescription paramDesc)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Swashbuckle.Swagger.OperationGenerator.ApiDescriptionToOperation(ApiDescription apiDescription)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Swashbuckle.Swagger.ApiExplorerAdapter.CreateApi(IGrouping`2 apiDescriptionGroup, OperationGenerator operationGenerator)
   at Swashbuckle.Swagger.ApiExplorerAdapter.<>c__DisplayClassb.<GetDeclaration>b__7(IGrouping`2 apiDescGrp)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Swashbuckle.Swagger.ApiExplorerAdapter.GetDeclaration(String basePath, String version, String resourceName)
   at Swashbuckle.Application.CachingSwaggerProvider.<>c__DisplayClass4.<GetDeclaration>b__3(String k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Swashbuckle.Application.CachingSwaggerProvider.GetDeclaration(String basePath, String version, String resourceName)
   at Swashbuckle.Application.SwaggerSpecHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Web.Http.HttpServer.<>n__FabricatedMethod9(HttpRequestMessage , CancellationToken )
   at System.Web.Http.HttpServer.<SendAsync>d__0.MoveNext()

如果我将路线更改为:
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
)

Swagger 页面然后工作,但实际的 api 没有!

所以问题是,我怎样才能让 Swagger 与版本化的 api 一起工作?

最佳答案

最后我用了SDammann.WebApi.Versioning nuget 包和以下路线:

VersionedControllerSelector.VersionPrefix = "v";

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "v{version}/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

我的 Controller 位于名为 v1 或 v2 等的命名空间中。

关于asp.net - web-api 和 swagger 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24779180/

相关文章:

c# - 使用 ASP.Net Webapi 流式传输大图像

c# - asp.net webapi 绑定(bind) ef 模型与文件

javascript - 如何记录 (jsduck/jsdoc) cucumber.js 步骤定义?

documentation - 是否可以将源代码与 Rust 中的文档注释分开?

asp.net - 使用 ConfigurationManager 从任意位置加载配置

c# - 从地址获取纬度经度c#

c# - 如何在 MVC ASP.NET 中存储 bool 矩阵

asp.net - 简单整数正则表达式

vue.js - 如何将 ASP Core Web API VueJS 站点部署到 IIS

documentation - 如何为客户端记录 Web 服务