webapi框架搭建系列博客
上一篇:创建项目(二)
在上一篇里,我们已经创建好了webapi应用,并已经部署到iis里,本篇讲如何用owin自宿主或是iis宿主来部署webapi应用。
owin介绍
传统的asp.net网站只能部署在iis下,缺点是网站应用和服务器(即iis)耦合,这样便导致一个简单的请求在最终到达我们自己写的业务代码之前还要经过一系列iis自带的各种modules和handlers及其它的机制(asp.net request pipeline),在我的开发经验中就经常遇到各种iis的问题导致一个简单的请求访问失败的情况。
现在的owin规范可以很好的解决这个问题,对owin的介绍和了解请参考:owin官网(http://owin.org/)和微软对owin规范的实现(https://docs.microsoft.com/zh-cn/aspnet/aspnet/overview/owin-and-katana/)
以iis为宿主
步骤
引入Microsoft.Owin.Host.SystemWeb
这个包的目的是将到达iis的请求转发到owin管道
此包只有一个程序集:Microsoft.Owin.Host.SystemWeb.dll
此包依赖于:Microsoft.Owin和Owin包
创建Startup.cs文件
代码如下
using Microsoft.Owin; using Owin; using System.Threading.Tasks; // 标识webapiOwin.Startup类为owin的启动类,也可写在AssemblyInfo.cs文件里 [assembly: OwinStartup(typeof(webapi.Owin.Startup))] namespace webapi.Owin { public class Startup { /// <summary> /// owin的http请求管道配置函数 /// </summary> /// <param name="app"></param> public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888 app.Run(context => { context.Response.Write("这个owin管道"); return Task.FromResult(0); }); } } }
编译后测试接口地址:http://localhost:101/api/test
如上图结果,和”创建项目(二)“中的请求地址是一样的:http://localhost:101/api/test,但返回的结果却不是TestController.Get方法里的,证明request请求并没有经过webapi,而是进入到owin的管道。
补充:
如果将网站目录bin下的Microsoft.Owin.Host.SystemWeb.dll删除,同样访问接口地址:http://localhost:101/api/test,返回的是webapi接口里的处理的结果(和创建项目(二)一样),由此可得出结论:Microsoft.Owin.Host.SystemWeb.dll会将拦截到的iis里的请求转到owin管道,如果没有了此dll,请求会照旧用asp.net pipeline。
总结:
1、引用Microsoft.Owin.dll和Owin.dll程序集,编写owin的Startup类。
在Startup类的Configuration函数里写owin 的middlewares
2、引用Microsoft.Owin.Host.SystemWeb.dll
3、完成
iis接收到的请求怎么最终进入到了我们的owin middlewares里,完全交给Microsoft.Owin.Host.SystemWeb.dll去处理了。
owin自宿主
owin的四大结构为Host,Server,Middleware,Application。用自宿主的方式可完全抛开iis。
步骤
创建console应用
引用Microsoft.Owin.SelfHost包
注意会安装其它的依赖包,Microsoft.Owin.Hosting,Owin,Microsoft.Owin.Diagnostics,Microsoft.Owin.Host.HttpListener,Microsoft.Owin
编写控制台代码
using Microsoft.Owin.Hosting; using System; namespace MyOwinSelfHost { class Program { static void Main(string[] args) { // WebApp.Start<Startup>和WebApp.Start都可以用,建议用后者,这样通用性强。OwinHost.exe就是用这种方法 // 区别为: // 如用WebApp.Start<Startup>则要引用Startup类所在的项目 // 如用WebApp.Start,则生成的控制台程序的当前目录下要有含[assembly: OwinStartup(xxx)]才能正常运行 //using (WebApp.Start<Startup>("http://localhost:12345")) using (WebApp.Start("http://localhost:12345")) { Console.ReadLine(); } } } }
运行
1、将编译的控制台程序(MyOwinSelfHost.exe)放入到网站的bin目录下,注意要将控制台程序里的相关dll文件也拷贝到webapi项目里
2、双击MyOwinSelfHost.exe,运行控制台程序(此时控制台程序里什么都没有,也不会自动退出的,图就不上了)
3、用postman返回接口接口地址:http://localhost:123456/api/test (注意,现在已经不是iis里的网站地址了,完全是由控制台程序“新建”的一个“网站”),结果如下
当然,如果不想自己写宿主,也可以用微软已经写好的owinhost.exe,请参考另一篇博客owinhost.exe用法
上面两个标题的内容讲的是如何用owin技术,当然owin技术的四大结构的细节没有讲,我的重点是梳理owin技术是如何和iis及自宿主(selfhost)交互,而owin里的其它技术细节会在后面的专题里介绍。可以看到,我们用iis宿主和自宿主(selfhost)都已经实现了一个接口类网站应用的雏形(但访问的接口地址没有进入webapi 的action里),下面介绍webapi如何和owin技术结合。
owin和webapi
参考官方文档:
步骤
引入 Microsoft.AspNet.WebApi.OwinSelfHost
注意:Microsoft.AspNet.WebApi.OwinSelfHost包里本身没有含任何dll的,nuget里只是提供了一个快捷引入webapi和owin所需所有包的快捷方式。本质上是要引用Microsoft.Owin.Hosting包,Microsoft.Owin.Host.HttpListener包,Microsoft.AspNet.WebApi.Owin包。不要被“OwinSelfHost"的名字所误导。
在owin里加入webapi middleware
Startup.cs代码如下
public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888 app.UseWebApi(WebApiConfig.OwinWebApiConfiguration(new HttpConfiguration())); }
WebApiConfig如下,只要看OwinWebApiConfiguration方法里的就行。
using System.Web.Http; namespace webapi.Configs { /// <summary> /// webapi 配置类 /// </summary> public static class WebApiConfig { /// <summary> /// 做为委托提供给System.Web.Http.GlobalConfiguration.Configuration() /// 用于webapi以iis为服务器的情况 /// </summary> /// <param name="config"></param> public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } /// <summary> /// 返回webapi的httpconfiguration配置 /// 用于webapi应用于owin技术时使用 /// </summary> /// <returns></returns> public static HttpConfiguration OwinWebApiConfiguration(HttpConfiguration config) { config.MapHttpAttributeRoutes();//开启属性路由 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); return config; } } }
运行
编译后,不管是以iis宿主的方式还是以自宿主的方法托管webapi网站,都能访问TestController.cs的Get()接口方法,结果如下:
1、部署在iis下
postman访问接口地址 (get方法):http://localhost:101/api/test
postman测试的返回结果:"this is TestController.Get()"
2、双击”MyOwinSelfHost.exe“,部署webapi应用
postman访问接口地址 (get方法):http://localhost:123456/api/test
postman测试的返回结果:"this is TestController.Get()"