NSwag在asp.net web api中的使用,基于Global.asax
https://github.com/NSwag/NSwag/wiki/OwinGlobalAsax
This page explains how to use the NSwag OWIN middleware in your "Global.asax"-based web project.
It is recommended to migrate your project to a completely OWIN-based project and use the OWIN middleware directly.
Sample project https://github.com/RSuter/NSwag/tree/master/src/NSwag.Sample.NetGlobalAsax
https://github.com/RSuter/NSwag/tree/master/src/ 这个路径下还有一些其他的demo
Integration
1. Install NuGet packages
Install the NuGet packages:
其中Microsoft.Owin.Host.SystemWeb依赖于另外2个
Microsoft.Owin (>= 4.0.0)
Owin (>= 1.0.0)
其中NSwag.AspNet.Owin的依赖如下
- Microsoft.Owin (>= 3.0.1)
- Microsoft.Owin.StaticFiles (>= 3.0.1)
- NJsonSchema (>= 9.13.15)
- NSwag.Core (>= 12.0.12)
- NSwag.SwaggerGeneration (>= 12.0.12)
- NSwag.SwaggerGeneration.WebApi (>= 12.0.12)
- Owin (>= 1.0.0)
2. Edit web.config
Then open your Web.config and add the following app setting:
<configuration>
<appSettings>
<add key="owin:AutomaticAppStartup" value="false" />
</appSettings>
...
Now we need setup the routing of the Swagger requests. There are two ways to do this:
2.a) Pipe all request to the .NET pipeline
In the system.webServer tag, set runAllManagedModulesForAllRequests to true so that all requests are piped to ASP.NET:
<system.webServer>
...
<modules runAllManagedModulesForAllRequests="true">
...
2.b) Pipe only the Swagger request to the specific middlewares
Important: The routes defined in the web.config and the UseSwagger/UseSwaggerUi methods must be the same:
<system.webServer>
...
<handlers>
...
<add name="NSwag" path="swagger" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
3. Edit Global.asax.cs
Now, open the Global.asax.cs and add the following call at the beginning of the Application_Start method:
/// <summary>
/// https://blog.rsuter.com/nswag-tutorial-integrate-the-nswag-toolchain-into-your-asp-net-web-api-project/
/// https://github.com/RSuter/NSwag/wiki/OwinGlobalAsax
/// </summary>
/// <param name="config"></param>
public static void RegisterNSwag()
{
RouteTable.Routes.MapOwinPath("swagger", app =>
{
app.UseSwaggerUi(typeof(WebApiApplication).Assembly, settings =>
{
settings.MiddlewareBasePath = "/swagger";
});
});
}
Now, start the web project and browse to "http:/localhost:port/swagger" and the Swagger UI should be loaded.
添加之后遇到的问题:
Server Error in '/LISA.WebApi.Chile' Application.
The method 'post' on path '/api/CodeStocks' is registered multiple times (check the DefaultUrlTemplate setting [default for Web API: 'api/{controller}/{id}'; for MVC projects: '{controller}/{action}/{id?}']).
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: The method 'post' on path '/api/CodeStocks' is registered multiple times (check the DefaultUrlTemplate setting [default for Web API: 'api/{controller}/{id}'; for MVC projects: '{controller}/{action}/{id?}']).
https://github.com/RSuter/NSwag/issues/664
@nkm8 See domaindrivendev/Swashbuckle#142 (comment) for some background information about the query parameters not being part of the path:
https://github.com/domaindrivendev/Swashbuckle/issues/142#issuecomment-66492163
Unfortunately this is a constraint imposed by the Swagger specification https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md.
I had some late involvement with the Swagger 2.0 working group and pushed hard to have this constraint removed but to no avail. As you pointed out, this does cause an issue for certain WebApi implementations. I'll describe the workaround below but first I want to play devil's advocate and look at it from an API perspective, agnostic of implementation frameworks or even specific language constructs.
In it's essence, the constraint really just says the following paths have to be described as one operation.
GET api/products
GET api/products?producType={productType}
Behind the scenes these may be implemented as separate C# or separate
Java methods, but in the context of describing a REST API, would you
describe them separately? Swagger 2.0 says "No ... it's one operation
with an optional productType parameter".
Technically, I believe they are two different resources (hence why I
opposed the constraint) but I do see some sense in the Swagger 2.0
approach. For example, I don't think I've ever seen any API docs broken
down this way - it's invariably just by path with additional information
about query parameters included.
Anyway, philosophy aside - breaking the Swagger 2.0 spec is not an option and so I can only provide some workarounds.
The most straight forward would be to consolidate your multiple,
"overloaded", actions with a single action with optional parameters. You
could even delegate internally to the private overloaded versions.
If a change to the implementation isn't an option - Swashbuckle 5.0 provides a config setting ResolveConflictingActions.
This takes a function of the form -
Func<<IEnumerable<ApiDescription>, ApiDescription> which
you can provide to consolidate the actions into one ApiDescription, and
therefore one Operation, at the documentation level only.
This "merge" process will get trickier if the response type and
errors codes also differ but at that point you'd have to ask questions
about the API design.
Hope this helps - let me know if it makes sense?
https://github.com/RSuter/NSwag/issues/1242
app.UseSwaggerUi3(typeof(Startup).Assembly, settings =>
{
settings.GeneratorSettings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
settings.GeneratorSettings.DefaultUrlTemplate = "{controller=Home}/{action=Index}/{locale?}";
settings.GeneratorSettings.IsAspNetCore = true;
});
最后搭建成功的效果

多个controller的效果图

NSwag在asp.net web api中的使用,基于Global.asax的更多相关文章
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- 在ASP.NET Web API中使用OData
http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
- Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...
- ASP.NET WEB API 中的路由调试与执行过程跟踪
路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...
- 能省则省:在ASP.NET Web API中通过HTTP Headers返回数据
对于一些返回数据非常简单的 Web API,比如我们今天遇到的“返回指定用户的未读站内短消息数”,返回数据就是一个数字,如果通过 http response body 返回数据,显得有些奢侈.何不直接 ...
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- 【ASP.NET Web API教程】5.5 ASP.NET Web API中的HTTP Cookie
原文:[ASP.NET Web API教程]5.5 ASP.NET Web API中的HTTP Cookie 5.5 HTTP Cookies in ASP.NET Web API 5.5 ASP.N ...
随机推荐
- 面试题思考:java中快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除.修改),则会抛出Concurrent Modification Exceptio ...
- ios 时间解析 差8个小时
啥问题也有:小程序中web开发工具里显示时间正常,ios上显示的查8小时 原因: 使用 NSDate *date = [NSDate date]; 获取的时间是标注的UTC时间,和北京时间相差8小时. ...
- 6号css学习小记
一.overfloat属性:(四个值) visible :默认值.内容不会被修剪,会呈现在元素匡之外. hidden:内容会被修剪,并且其余内容是不可见的. scroll :内容会被修剪,但是浏览器会 ...
- Kafka — 高吞吐量的分布式发布订阅消息系统【转】
1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件 ...
- mysql主从同步因断电产生的不能同步问题
偶尔因为断电导致mysql slave 出现复制错误“Could not parse relay log event entry” Could not parse relay log event en ...
- Web 编程中编码问题
1. 常见字符编码 iso-8859-1(不支持中文) gbk(国标码) utf-8 (万国码, 支持全世界的编码) 2. 响应编码 当使用 response.getWriter() 来向客户端发送字 ...
- continue、return和break的区别
1.return 语句的作用 (1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行. (2) return 返回一个值给调用该方法的语句,返回值的数 ...
- ie6不能播放视频问题
前几天做项目时碰到一个非常棘手的问题.在我自己本机的ie8上能正常播放视频的程序(ie6也能够),放用户的电脑上就是不能正常播放(可能是用户的机子系统太老或是别的什么原因.详细的我也不太清楚).没办法 ...
- Spring的IoC模式
1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它.下面看一个 ...
- linux c编程:记录锁
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...