using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Pactera.Bpm.TestProject.MiddlewareTest
{
[TestFixture]
public class TestMiddleware
{
[Test]
public void TestMiddlewareImpl()
{
var context = new HttpContext();
var builder = new AppBuilder();
builder.Use(next =>
{
return (ctx) =>
{
ctx.AddMessage("m1 invoke");
next(ctx);
};
});
builder.Use(next =>
{
return (ctx) =>
{
ctx.AddMessage("m2 invoke");
next(ctx);
};
}); //app.Use((ctx, next) =>
//{
// Console.WriteLine("m3 message:{0}", ctx.Message);
// ctx.Message = "Change by m3";
// next(ctx);
//}); var app = builder.Build();
app(context); context.DisplayMessage();
}
} public class HttpContext
{
private IList<string> _message = new List<string>();
public void AddMessage(string message)
{
_message.Add(message);
} public void DisplayMessage()
{
foreach (var msg in _message)
{
Console.WriteLine(msg);
}
}
} public delegate void HttpRequestTask(HttpContext context); public class AppBuilder
{
private IList<Func<HttpRequestTask, HttpRequestTask>> middlewares = new List<Func<HttpRequestTask, HttpRequestTask>>(); public void Use(Func<HttpRequestTask, HttpRequestTask> middleware)
{
middlewares.Add(middleware);
} //public void Use(Action<CustomeHttpContext, HttpTask> middleware)
//{
// var context = new CustomeHttpContext() { Message = "inner context" }; // middlewares.Add((ctx) =>
// {
// middleware(context, HandleRequest);
// return HandleRequest;
// }); //} public void Run(Action<HttpContext> middleware)
{
//var context = new HttpContext() { Message = "inner context" };
//middleware(context);
} public HttpRequestTask Build()
{
HttpRequestTask next = (ctx) =>
{
ctx.AddMessage("Start app 404");
}; var newmiddlewares = middlewares.Reverse<Func<HttpRequestTask, HttpRequestTask>>(); foreach (var middleware in newmiddlewares)
{
next = middleware(next);
} return next;
}
}
}

c# Middleware impl的更多相关文章

  1. Python实现各类验证码识别

    项目地址: https://github.com/kerlomz/captcha_trainer 编译版下载地址: https://github.com/kerlomz/captcha_trainer ...

  2. 用Middleware给ASP.NET Core Web API添加自己的授权验证

    Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做到完全的前后端分离.API的实现方式有很 多,可以用ASP.NET Core.也可以用ASP.NET Web ...

  3. [转]Writing Custom Middleware in ASP.NET Core 1.0

    本文转自:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ One of the new ...

  4. [转]用Middleware给ASP.NET Core Web API添加自己的授权验证

    本文转自:http://www.cnblogs.com/catcher1994/p/6021046.html Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做 ...

  5. Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案

    最近手头的工作不太繁重,自己试着倒腾了一套用开源框架组建的 JavaWeb 后端解决方案. 感觉还不错的样子,但实践和项目实战还是有很大的落差,这里只做抛砖引玉之用. 项目 git 地址:https: ...

  6. [译]Writing Custom Middleware in ASP.NET Core 1.0

    原文: https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ Middleware是ASP. ...

  7. 爬虫 htmlUnit遇到Cannot locate declared field class org.apache.http.impl.client.HttpClientBuilder.dnsResolve错误

    当在使用htmlUnit时遇到无法定位org.apache.http.impl.client.HttpClientBuilder.dnsResolver类时,此时所需要的依赖包为: <depen ...

  8. 如何在android studio 1.0 启动时设置代理【解决WARN - ateSettings.impl.UpdateChecker - Connection failed.】

    今天第一次用android studio,下了个比较新的1.0.1 linux版本,结果启动时老是出现以下错误: [ 6987] WARN - ateSettings.impl.UpdateCheck ...

  9. 使用静态函数impl模式做接口

    使用静态函数impl模式做接口 impl即桥接模式,主要是为了隐藏数据和减少不必要的编译. 普通的impl模式做接口一般是: A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B ...

随机推荐

  1. (二)无状态的web应用(单py的Django占位图片服务器)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 阅读本文建议了解Django框架的基本工作流程,了解WSGI应用,如果对以上不是很清楚,建议结 ...

  2. 论文笔记:蒸馏网络(Distilling the Knowledge in Neural Network)

    Distilling the Knowledge in Neural Network Geoffrey Hinton, Oriol Vinyals, Jeff Dean preprint arXiv: ...

  3. RBAC权限模型——项目实战

    RBAC权限模型——项目实战

  4. 20145316《Java程序设计》第十周学习总结

    学习内容总结 网络编程 1.网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 2.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴. 3.在发 ...

  5. ANE报错fix:Could not generate timestamp: Connection reset.

    如果你打包ANE时候 报了:Could not generate timestamp: Connection reset. 那么很有可能你用了JDK 1.8. 解决方案一 退回到 JDK 1.7,重新 ...

  6. uboot下ext4load的用法

    将sd卡的某个分区下的某个目录里的某个文件加载到内存的某个地址,示例如下: ext4load mmc 0:1 0xa0000000 /bin/vi

  7. RedHat5.4 使用 centOS5源更新

    1.卸载HedHat5.4的yum命令     先查看RedHat上是否安装yum            删除所有的yum软件     rpm -qa | grep yum | xargs rpm - ...

  8. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  9. prometheus statsd 监控

    Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们 ...

  10. spark SQL学习(认识spark SQL)

    spark SQL初步认识 spark SQL是spark的一个模块,主要用于进行结构化数据的处理.它提供的最核心的编程抽象就是DataFrame. DataFrame:它可以根据很多源进行构建,包括 ...