首先通过VisualStudio创建一个控制台应用
然后添加Owin的Nuget包引用
需要的包如下
Owin Microsoft.Owin Microsoft.Owin.Hosting Microsoft.Owin.Host.HttpListener筹备事情到此结束
编写OwinStartup类 public class Startup { public void Configuration(IAppBuilder app) { app.Run(HandleRequest); } static Task HandleRequest(IOwinContext context) { context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Hello world from myOwin"); } }当OwinHost运行时,会首先加载Startup类,Configuration要领是必需有的,在Configuration要领中向Owin管道插入中间件,所有的请求都是中间件措置惩罚惩罚。
在这个Configuration中app.Run(HandleRequest);要领的感化是向管道中添加一个没有后续中间件的中间件,一般来讲一个Owin管道中有许多中间件,差此外中间件措置惩罚惩罚差此外工作,在措置惩罚惩罚结束后选择性的挪用后面的中间件,例如某个身份验证中间件可以在验证掉败时结束请求。而app.Run要领就是插如一个没有后续事项的中间件。稍后我们会编写通例的中间件。
这其中间件做的事很简单,就是向响应写入一个字符串,无论请求是什么功效都是一样的。
在Main要领中启动Host static void Main(string[] args) { var url = "http://localhost:8080/"; var opt = new StartOptions(url); using (WebApp.Start<Startup>(opt)) { Console.WriteLine("Server run at " + url + " , press Enter to exit."); Console.ReadLine(); } }StartOptions类用来指定一些启动参数,最少应该指定一个url,这里一并指定了使用8080端口
启动措施控制台输出如下
Server run at :8080/ , press Enter to exit.用浏览器打开 :8080/
效果如下:
测验考试变动路径你得到的始终是一个功效
你可以测验考试将Configuration中的代码注释失,在运行措施,这是访谒将得到空页面,Http代码也将是404,因为Owin管道中没有中间件措置惩罚惩罚请求。
我们编写一个名为Ding的中间件
public class DingMiddleware : OwinMiddleware { public DingMiddleware(OwinMiddleware next) : base(next) { } public override Task Invoke(IOwinContext context) { if (context.Request.Path.Value.Equals("/home/index")) { context.Response.Write("hello world from home/index"); } if (Next != null) { return Next.Invoke(context); } return Task.CompletedTask; } }这其中间件在检测到访谒路径是/home/index时向Response中写入一句话,然后检测是否有下一其中间件,如果有就挪用。
添加中间件到Configuration可以直接在Configuration中插手app.Use<DingMiddleware>()来插入中间件,但是我们一般使用扩展要领来做这件事。
public static class MyMidlewareExtention { public static IAppBuilder UseDing(this IAppBuilder app) { return app.Use<DingMiddleware>(); } }改削Configuration中的代码:
public void Configuration(IAppBuilder app) { app.UseDing(); app.Run(HandleRequest); }此刻管道中有两其中间件了,此刻运行措施,在地点栏中输入:8080/home/index将得到如下功效
hello world from home/indexHello world from myOwin
因为Ding中间件在措置惩罚惩罚之后继续挪用了接下来的中间件
输入其他路径将得到Hello world from myOwin这个功效
如果将Configuration中的两其中间件位置变更,的到的功效只有一个Hello world from myOwin,因为app.Run(HandleRequest);不执行后续的中间件。
第二其中间件 public class DiDiDiMiddleware : OwinMiddleware { public DiDiDiMiddleware(OwinMiddleware next) : base(next) { } public override Task Invoke(IOwinContext context) { if (context.Request.QueryString.Value == "boom") { context.Response.Write("Boom! Boom! Boom!"); return Task.CompletedTask; } if (Next != null) { return Next.Invoke(context); } return Task.CompletedTask; } }这其中间件在地点栏QueryString(?后边的部分)即是boom时结束请求。
MyMidlewareExtention代码改削如下:
public static class MyMidlewareExtention { public static IAppBuilder UseDing(this IAppBuilder app) { return app.Use<DingMiddleware>(); } public static IAppBuilder UseDiDiDi(this IAppBuilder app) { return app.Use<DiDiDiMiddleware>(); } }Startup类改削如下:
public class Startup { public void Configuration(IAppBuilder app) { app.UseDiDiDi(); app.UseDing(); } }这里去失了app.Run此时,对付非/home/index的请求会得到404,,所以我们暂时窜改下代码将HandleRequest要领封装成一个默认的中间件
代码窜改如下:
public class DefaultMiddleware : OwinMiddleware { public DefaultMiddleware(OwinMiddleware next) : base(next) { } public override Task Invoke(IOwinContext context) { var path = context.Request.Path.Value; context.Response.Write($"hey you come from {path}!"); return Task.CompletedTask; } }运行措施不雅察当作果是否切合预期。
当地点中含有?boom时会的到一个Boom!Boom!Boom!