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

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

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

编写中间件需要引入

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. 三、Linux学习之命令基本格式篇

    一.命令格式 命令 [选项] [参数] 注意: 1.和别命令使用不遵循此格式 2.当有多个选项时,可以写在一起 3.简化选项与完整选项(-a 等价于--all) 4.中括号为可选,意思是可以有可以没有 ...

  2. 发现视口(窗口)自适应的新大陆!!vw、vh

    从事前端已经1年了,一直为背景自适应铺满整个屏幕而苦苦发愁,因为要适配不同的pc显示器,所以高度不能写死,但是写(height:100%)并不能实现,愁死我了~我要不用写好的css框架实现或者自己写j ...

  3. 视音频数据处理入门:RGB、YUV像素数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  4. MAC下 Apache服务器配置

    今天做了一个注册登录提交的页面,后续操作需要用到后端的知识 php+Mysql,之前只是有些了解,现在开始具体操作了,首先从配置环境开始.查了好几篇文档与博客,了解了挺多知识. Mac下Apache服 ...

  5. isscroll插件 实现下拉加载 上啦刷新 转

    http://www.jb51.net/article/98394.htm 下面是别人的代码 <!DOCTYPE html> <html> <head> <m ...

  6. new FileInputStream(file)中file不能为文件夹

    今天闲来无事,写了如下程序: package com.xhj.test; import java.io.File; import java.io.FileFilter; import java.io. ...

  7. bzoj千题计划159:bzoj2055: 80人环游世界(有源汇上下界可行最小费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2055 某个国家必须经过vi次, 可以转化为上下界都为vi的边 对这张图做有源汇上下界可行最小费用流 ...

  8. java正则:不包含某个规则字符串【转】

    概述 做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式.例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符 ...

  9. Web API: Security: Basic Authentication

    原文地址: http://msdn.microsoft.com/en-us/magazine/dn201748.aspx Custom HttpModule code: using System; u ...

  10. django错误笔记——URL

    django提交表单提示"RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and ...