press Enter to exit.");Console.ReadLine();}} StartOptions类用

时间:2022-01-31 09:05:34

首先通过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/
效果如下:

`Hello world from myOwin`

测验考试变动路径你得到的始终是一个功效
你可以测验考试将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; } }


public class Startup { public void Configuration(IAppBuilder app) { app.UseDiDiDi(); app.UseDing(); app.UseDefault(); } }

运行措施不雅察当作果是否切合预期。
当地点中含有?boom时会的到一个Boom!Boom!Boom!