为什么我们需要OWIN
过去,IIS作为.NET开发者来说是最常用的Web Server(没有之一),源于微软产品的紧耦合关系,我们不得不将Website、Web Application、Web API等部署在IIS上,事实上在2010年前并没有什么不妥,但随着近些年来Web的发展,特别是移动互联网飞速发展,IIS作为Web Server已经暴露出他的不足了。主要体现在两个方面,ASP.NET (System.Web)紧耦合IIS,IIS紧耦合OS,这就意味着,我们的Web Framework必须部署在微软的操作系统上,难以跨平台。
...
OWIN是什么?在本文里面就不进行赘述,网上有很多介绍OWIN的信息以及优缺点的博文,这里可以给几个链接大家进行自行参考:
..
下面我们重点介绍我在搭建OWIN自宿主平台的过程,对于我是学习的过程,对于想要接触他的大家来说,也是一种帮助。
很多人搭建的OWIN+WebApi项目都是写在一个项目中的,我个人为了代码的隔离,将控制器层写在了另外一个项目中,这样有助于后期大型框架的形成。
下面是搭建步骤:
1、首先新建一个控制台应用程序和一个.NETFramework类库项目,控制台引用类库项目。
项目结构如下图所示:

OWIN.WebApi WebApi层
OWIN.WebApi.Sv WebApi服务层,将要作为启动项!
2、控制台项目使用NuGet引用需要的类库:
OWIN
Microsoft.Owin.Hosting
Microsoft.Owin.Host.HttpListener
Microsoct.AspNet.WebApi.Owin
这里需要手动从WebApi项目里面找到System.Web.Web,System.Net.Http等Web类库进行引用。
OWIN.WebApi.Srv层的引用情况(我这里有跨域配置,不需要的请忽略)

在OWIN.WebApi层,我们需要同样引用Web的类库,我们才可以在WebApi项目控制器层继承自ApiController
OWIN.WebApi层的引用情况(我这里有跨域配置,不需要的请忽略)

3、因为WebApi层要分开类库项目写,所以这里比一般的OWIN要多一些配置,在我项目的OWIN.WebApi层的config目录下,我新建了一个Global.cs类,里面的代码是对控制器的解析,代码展示如下:
1 using System.Web.Http; 2 using System.Web.Http.Dispatcher; 3 using System; 4 using System.Collections.Concurrent; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Net; 8 using System.Net.Http; 9 using System.Web.Http.Controllers; 10 11 namespace OWIN.WebApi.config 12 { 13 public class WebApiApplication : System.Web.HttpApplication 14 { 15 protected void Application_Start() 16 { 17 //ignore the xml return it`s setting let json return only 18 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 19 GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 20 21 GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), 22 new WebApiControllerSelector(GlobalConfiguration.Configuration)); 23 } 24 } 25 /// <summary>