[英]web-api & swagger documentation
I've written a asp web-api and I've added versioning to the api using this class . 我写了一个asp web-api,我已经使用这个类为api添加了版本。
My routes look like this: 我的路线看起来像这样:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{namespace}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config));
So I can access https://localhost:44301/v1/test
所以我可以访问
https://localhost:44301/v1/test
I'm now trying to add Swagger to produce some api documentation (actually I'm using the Swashbuckle Nuget package) 我现在正在尝试添加Swagger来生成一些api文档(实际上我正在使用Swashbuckle Nuget包)
When I browse to /swagger
the page loads but comes up with errors for all the controllers: 当我浏览
/swagger
页面加载但是所有控制器都出错:
Unable to read api 'TestController' from path https://localhost:44301/swagger/api-docs/TestController (server returned undefined)
If I browse to https://localhost:44301/swagger/api-docs/TestController
it comes up with a NullReferenceException
with a stack trace of: 如果我浏览到
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()
If I change the route to this: 如果我改变路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
)
The Swagger pages then work, but the actual api doesn't! Swagger页面然后工作,但实际的api不行!
So the question is, how can I make Swagger work with a versioned api? 所以问题是,如何让Swagger使用版本化的api?
In the end I used SDammann.WebApi.Versioning
nuget package and the following routes: 最后我使用了
SDammann.WebApi.Versioning
nuget包和以下路由:
VersionedControllerSelector.VersionPrefix = "v";
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "v{version}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
My controllers are in a namespace called v1 or v2 etc. 我的控制器位于名为v1或v2等的命名空间中。
try this 尝试这个
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
//defaults: new { id = RouteParameter.Optional }
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.