Owin中间件动手做
摘要:本文目的是了解Owin基本原理。讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件
准备工作
首先通过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 http://localhost:8080/ , press Enter to exit.
用浏览器打开 http://localhost: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);
}
现在管道中有两个中间件了,现在运行程序,在地址栏中输入http://localhost: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!
总结:Owin的管道概念其实简单易懂,在程序启动之前,向里面插入中间件,中间件决定请求是否继续向下走。在管道中的中间件可以拿到请求的所有信息以对请求进行处理,管道里的中间件执行结束之后,这个请求就被处理完成了,然后发回浏览器。
Owin中间件动手做的更多相关文章
- Owin中间件动手玩
摘要:本文目的是了解Owin基本原理.讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件 准备工作 首先通过VisualStudio创建一个控制台应用 然后添加Owin的Nuge ...
- owin 中间件 katana 如何解密cookie
.NET MVC5 默认的用户登录组件是AspNet.Identity ,支持owin,并且微软自己实现的一套owin 中间件叫 katana 补充一下 katana项目源码地址:https://ka ...
- Owin中间件搭建OAuth2.0认证授权服务体会
继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...
- 动手做第一个Chrome插件
Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...
- IP工具类-自己动手做个ip解析器
IP工具类-自己动手做个ip解析器 一.资料准备 导入依赖包:
- 使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- 自己动手做AI:Google AIY开发工具包解析
2018年国际消费性电子展(CES)上,最明显的一个趋势是Amazon与Google的语音技术进驻战,如AmazonAlexa进驻到Acer笔电内,Google Assist进驻到KIA汽车内,其他如 ...
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
线程安全使用(四) 这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...
随机推荐
- week6:个人博客作业
这周主要是参与团队编程的讨论 团队编程中发现很多问题: 1,每个人共同空闲的时间不好找 就我组来说,我是考研,每天晚上都要去外面上课,有的人在进行大创,,也有的像我一样在整考研的东西,还有的进行其他, ...
- VS2015安装与单元测试
很久之前就听说微软有一款强大的编程软件——Visual Stdio系列,也许是满足于VC和CB的小巧一直都没有去尝试,借这次软件工程的机会终于可以一睹其真容,第一感觉是高大上,一改VC和CB的简洁,看 ...
- jQuery笔记(二)
$()下的常用方法 addClass():添加样式 removeClass():删除样式 $('div').addClass('box2 box4'); $('div').removeClass('b ...
- Git从零开始(一)
一.首先windows安装git客户端 官网下载地址:https://git-for-windows.github.io/,这里下载会很慢,我试了好几次都失败了. 百度网盘资源: https://pa ...
- WebSocket 时时双向数据,前后端(聊天室)
https://blog.csdn.net/lecepin/article/details/54632749 实例内容 今天主要说一下微信的WebSocket接口以及在小程序中的使用. WebSock ...
- Orchard是如何运行的
建立一个CMS网站(内容管理系统)是不同于建立一个普通的web站点:它更像是建立一个应用程序容器. 设计这样一个系统时,必须建立一流的可扩展性功能.这必需是一个非常开放式的构架,但是一个开放性的系统可 ...
- Vue---导航守卫使用方法详解
导航守卫 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航.有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的. 记住参数或查询的改变并不会触发进 ...
- Java基础整理之字节、数组、字符串、面向对象
一.字节(8个)8bit = 1B或1byte1024B = 1Kb 二.强制类型转换顺序及其大小顺序遵循向上转换的规则byte,short,char -> int -> long -&g ...
- sniffer 和 debug flow
sniffer 和 debug flow sniffer 和 debug flow 复制模板,直接修改IP即可使用: diagnose sys session filter clear diagnos ...
- Python OS模块中的fork方法实现多进程
import os '''使用OS模块中的fork方式实现多进程''' '''fork方法返回两次,分别在父进程和子进程中返回,子进程中永远返回0,父进程返回的是子进程的is''' if __name ...