前面一篇文章简单的介绍了中间件的应用

下面编写一个自定义的中间件类库,并加入中间件参数以及引入日志记录中间件的异常

下面来看下中间件的构造,参数可以自定义 这里我定义了一个参数类

编写中间件需要引入

Owin

Microsoft.Owin;

中间件类需要继承类:OwinMiddleware

 /// <summary>
/// 自定义的中间件
/// </summary>
public class CustomMiddleware : OwinMiddleware
{
CustomMiddlewareParameters _parameter;
public CustomMiddleware(OwinMiddleware next, CustomMiddlewareParameters parameter) : base(next)
{
_parameter = parameter;
}
public override Task Invoke(IOwinContext c)
{
if (Next != null)
{
try
{
var cookie = c.Request.Cookies.ToList();
string allcookie = string.Empty;
string allenvi = string.Empty;
foreach (var cok in cookie)
{
allcookie += cok.Key + "---------------" + cok.Value + "<br />";
c.Environment.Add(cok.Key, cok.Value);
} foreach (var envi in c.Environment)
{
allenvi += envi.Key + "---------------" + envi.Value + "<br />";
} var msg = Encoding.UTF8.GetBytes(allcookie + "<br /><br /><br /><br /><br /><br />" + allenvi);
c.Response.ContentType = "text/html; charset=utf-8";
c.Response.Write(msg, , msg.Length); //处理操作
return Next.Invoke(c);
}
catch (Exception ex)
{
_parameter.logs.Error(ex.Message);
}
}
return Task.FromResult<int>();
} }

这里我获取了cookies  以及 设置或获取 IOwinContext上下文中的环境变量,那么这里就可以搞事情了

我可以处理cookies  添加设置环境变量中的值 或者根据Request  Response中的做处理,或者这个中间件做一些事情 另外其他中间件来搞事情,但是要注意中间件引用的顺序

下面看下我的参数类:CustomMiddlewareParameters

 public class CustomMiddlewareParameters
{
public ILog logs { get; } public string siteName { get; set; }
public LYMOptions lymOptions { get; set; }
public CustomMiddlewareParameters()
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.config"));
this.logs = LogManager.GetLogger("CustomMiddlewareParameters");
this.lymOptions = new LYMOptions();
} internal void Validate()
{
if (siteName == null)
{
throw new ArgumentException("参数siteName不能设置为Null");
}
if (lymOptions == null)
{
throw new ArgumentException("参数cookieOptions不能设置为Null");
} } }

参数里面可以引入更多的参数,看实际业务需求,这里我随便定义了一些,同时这里可以验证参数等操作,我写了几个异常未来抛出日志

这里日志我引入了Log4.Net 包 当然也用可以用其他的 包括自己写一些

做好这一步,那么我来写一个扩展类 扩展IAppbuilder

 public static class CustomMiddlewareExtentions
{
public static IAppBuilder UseLYMMiddleware(this IAppBuilder builder, CustomMiddlewareParameters customParmeters)
{
try
{
customParmeters.Validate();
builder.Use<CustomMiddleware>(customParmeters);
}
catch (Exception ex)
{
customParmeters.logs.Error(ex.Message);
}
return builder;
} }

可以捕获一些异常情况,这句是中关键件的关键 builder.Use<CustomMiddleware>(customParmeters);

CustomMiddleware 为自定义的中间件类,参数为 params object []

到这里中间件基本就写好了

下来就是用:

在Web应用中引用 Microsoft.Owin.Host.SystemWeb

在Web寄宿类中添加  中间件引用就ok了

   app.UseLYMMiddleware(new CustomMiddlewareParameters());

这里我没有添加参数 会报错,查看日志的生成情况,这里需要配置下日志的XML

检查下日志已搞定

接下来看下正常情况是什么,中间件里面我输处理日志信息 以及 中间件环境变量信息

下面看下上面的信息,在中间里面就可以搞事情了比如:参数相关,中间件上下文对象都封装有这个IOwinContext对象

接下来看下这个中间件里面的参数

//
// 摘要:
// Gets the Authentication middleware functionality available on the current request.
//
// 返回结果:
// The authentication middleware functionality available on the current request.
IAuthenticationManager Authentication { get; }
//
// 摘要:
// Gets the OWIN environment.
//
// 返回结果:
// The OWIN environment.
IDictionary<string, object> Environment { get; }
//
// 摘要:
// Gets a wrapper exposing request specific properties.
//
// 返回结果:
// A wrapper exposing request specific properties.
IOwinRequest Request { get; }
//
// 摘要:
// Gets a wrapper exposing response specific properties.
//
// 返回结果:
// A wrapper exposing response specific properties.
IOwinResponse Response { get; }
//
// 摘要:
// Gets or sets the host.TraceOutput environment value.
//
// 返回结果:
// The host.TraceOutput TextWriter.
TextWriter TraceOutput { get; set; } //
// 摘要:
// Gets a value from the OWIN environment, or returns default(T) if not present.
//
// 参数:
// key:
// The key of the value to get.
//
// 类型参数:
// T:
// The type of the value.
//
// 返回结果:
// The value with the specified key or the default(T) if not present.
T Get<T>(string key);
//
// 摘要:
// Sets the given key and value in the OWIN environment.
//
// 参数:
// key:
// The key of the value to set.
//
// value:
// The value to set.
//
// 类型参数:
// T:
// The type of the value.
//
// 返回结果:
// This instance.
IOwinContext Set<T>(string key, T value);

Authentication:授权相关

Environment:上下文环境值  IDictionary<string, object> 这个类型

OwinRequest Request :封装的请求对象

IOwinResponse Response 请求的响应对象

以及一个 Get  Set 方法 这是设置 OWIN environment中的值

还有对输出处理  TraceOutput

中间件想一个生产企业的流水线一样,一次请求过来 经过流水线(不同的中间件)加工处理,最后到生产出产品就相当于网页的Reponse响应

Owin 自定义中间件(2)中间件进阶的更多相关文章

  1. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  2. 创建自定义的Middleware中间件

    创建自定义的Middleware中间件 阅读目录 何为Middleware中间件 使用Inline方式注册Middleware 使用Inline+ AppFunc方式注册Middleware 定义原生 ...

  3. 自定义Django的中间件

    分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...

  4. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  5. Owin 自定义中间件

    /// <summary> /// 自定义的中间件 /// </summary> public class CustomMiddleware : OwinMiddleware ...

  6. Python学习(三十七)—— 模板语言之自定义filter和中间件

    一.模板语言之自定义filter 自定义filter文件存放位置 模板中自定义函数 - 在已注册的app中创建一个名字叫 templatetags 文件夹 - 任意创建一个py文件 - 创建名字交 r ...

  7. ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用

    中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...

  8. django中间件及中间件实现的登录验证

    1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...

  9. 什么是中间件?中间件和java应用关系是什么

    中间件,比如websphere 是一种独立的系统软件,你的java应用要通过它来管理,比如数据库连接,消息通信等,中间件位于操作系统之上.简单滴说,你不可能直接把你的java应用部署在操作系统上,得由 ...

随机推荐

  1. Docker应用二:docker常用命令介绍

     Docker常用命令使用介绍 docker中常用的命令: 1.docker search image_name:搜查镜像 2.docker pull image_name:从镜像库中拉去镜像 3.d ...

  2. Guava之CaseFormat

    com.google.common.base.CaseFormat是一种实用工具类,以提供不同的ASCII字符格式之间的转换. 其对应的枚举常量 从以上枚举中可以看出,java程序员最常用的转换类型为 ...

  3. 服务器IP安全策略限制网络访问

    https://jingyan.baidu.com/article/3c343ff714d4890d377963cd.html https://www.icbase.com/TestGetUrl.as ...

  4. day3 程序流程控制

    今天主要学习了while和do/while,以及运用循环做一些小的练习. 学习了如何断点调试程序. 程序设计的步骤: 1.分析问题 2.确定数据结构和算法 3.编制程序 4.调试问题

  5. Linux初学之vmware Workstation 网络连接三种模式

    简介: VM(VMware Workstation简称VM,后面都将用VM代替阐述)是一款功能强大的虚拟化软件.VM支持在 单一的桌面上同时运行多款不同的操作系统,能够模拟完整的网络环境,支持pxe功 ...

  6. bzoj千题计划167:bzoj3527: [Zjoi2014]力

    http://www.lydsy.com/JudgeOnline/problem.php?id=3527 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei.      以n=4为例: ...

  7. Dialog插件artDialog

    经本人测试,发现没有layer好用,因为artDialog不能拖拽.不过除了拖拽,其他还蛮简洁的,在自定义上的灵活性也还可以.下面是我自己写的测试demo. <!DOCTYPE html> ...

  8. 让vcmi支持英雄无敌3中文版

    Table of Contents 1 Hack 日志 2 Changes 3 Install by compiling 4 reply of Ivan 1 Hack 日志 8月22日开始动手修改改v ...

  9. HDU 1846 Brave Game 巴什博奕

    解题报告:Alice和Bob在做一个取石子游戏,有一堆n个石子,然后规定每个人每次最少要去1个石子,最多可以取m个石子,最后一次取完石子的人为胜. 巴什博奕,关键是找到必胜点和必败点,我们可以先列举出 ...

  10. cin.get()和cin.getline()之间的区别

    cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别. cin.get()每次读取一整行并把由Enter键生成的换行符留在输 ...