OWIN全称是Open Web Interface for .NET,是针对.NET平台的开放Web接口。
有了OWIN,就可以让ASP.NET 脱离IIS,不用再去关心Web服务器的事情,这一点在ASP.NET Web API测试中特别方便,当然除了使用OWIN托管,还可以使用内存托管。
那么怎么使用OWIN托管?
0.新建ASP.NET Web API 2项目
ASP.NEt Web API 2出现这么久,除了旧项目,相信不会有人还使用第一版本了吧。我曾经尝试过在老项目添加OWIN托管,特别麻烦各种程序集不兼容,到最后也没成功。所以,不知道OWIN是不是不支持第一版本的API还是别的原因,如果要使用OWIN,建议升级到新版本的API再说。
因为使用OWIN主要是方便单元测试,所是新建项目的时候把”添加单元测试“勾上。
1.添加OWIN引用和Startup.cs启动文件
用nuget添加owin的引用(IAppBuilder在这里):
PM>Install-Package Owin
然后在项目添加Startup.cs:
using System.Web.Http; using Owin; namespace OwinHost { public class Startup { public void Configuration(IAppBuilder appBuilder) { var config=new HttpConfiguration(); WebApiConfig.Register(config); appBuilder.UseWebApi(config); } } }
接着再用nuget添加 Microsoft.AspNet.WebApi.Owin(UseWebApi扩展方法在这里)
PM>Install-Package Microsoft.AspNet.WebApi.Owin
使用nuget添加引用时,如果依赖的程序集版本不兼容,nuget会一并更新引用。
到这里,API项目添加OWIN已经完成,下面开始在单元测试中启动它。
2.在单元测试中启用项目
启动OWIN托管前,还要在测试项目引入Microsoft.Owin.Hosting(WebApp.Start方法在这里)和Microsoft.Owin.Host.HttpListener
PM> Install-Package Microsoft.Owin.Hosting PM> Install-Package Microsoft.Owin.Host.HttpListener
引用完后添加启动测试代码
namespace OwinHost.Tests { [TestClass] public class OwinHostStartTests:IDisposable { private const string HostAddress = "http://localhost:9000"; private static IDisposable _webApp; private static HttpClient _client; public OwinHostStartTests() { _webApp = WebApp.Start<Startup>(HostAddress); _client=new HttpClient(); _client.BaseAddress=new Uri(HostAddress); } [TestMethod] public void StartTest() { var response = _client.GetAsync("api/values").Result; Assert.AreEqual(HttpStatusCode.OK,response.StatusCode); Assert.AreEqual("value1",response.Content.ReadAsAsync<List<string>>().Result.ElementAt(0)); } public void Dispose() { _webApp.Dispose(); } } }
结果是顺利通过了
就这么简单的几步,很方便地添加了OWIN托管,极大的方便了测试,完全实现了一键运行测试,不用关心IIS。
3.可能遇到的问题
使用过程中,有可能会有某些程序集依赖版本不兼容问题,直接用nuget升级程序包就好了。
4.小结
添加OWIN托管不会对项目有任何副作用,更不会影响IIS部署,所以尽管放心服用。当然OWIN也直接托管ASP.NET也是没问题的,现在已经有非常完善的组件支持了,可以作为IIS替代方案。