AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)
AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)
在AspNetWebApi管线中存在两种类型的消息处理程序(Message Handler)
1.全局消息处理程序,所有的请求都将通过这些消息处理程序,全局的消息处理程序,通过HTTP配置的MessageHandlers.Add(消息处理程序),例如:
var config = New HttpConfiguration /HttpSelfHostHttpSelfHostConfiguration()
config.MessageHandlers.Add( new CustomMessageHandler());
2.路由消息处理程序,只有特定的请求才被定制的消息处理程序处理。,可以通过配置添加新路由实现
这里以博文【WebApi应用】通过定制MessageHandler来添加对调用程序的授权验证 的demo为例
_config = new HttpSelfHostConfiguration("http://localhost:5555");

_config.Routes.MapHttpRoute(
name:"CustomeRouteName",
routeTemplate: "api2/{controller}/{username}", //新路由
defaults: new { username = RouteParameter.Optional },
constraints: null,
handler: new CustomeMessageHandler //定制的消息处理程序
);

"api2/{controller}/{username}" 为新的路由URL模板,定制的消息处理程序(handler)只处理通过该UrlTemplate进行请求的消息
虽然定义了新的路由,然后运行程序:提示异常The inner handler has not been assigned

之所以执行新路由时候出现该异常是因为我们没有为定制的消息处理程序指定内部Http响应消息的处理程序,所以修改ValiteKeyMessageHandler类,在构造函数指定响应消息的处理程序.

public class ValiteKeyMessageHandler: DelegatingHandler {
public string AppKey { get; set; }
public ValiteKeyMessageHandler(string key, System.Web.Http.SelfHost.HttpSelfHostConfiguration configuration) {
this.AppKey = key;
//{ 此处为我们修改的 }
//为定制的消息处理程序指定响应消息的内部处理程序
InnerHandler = new System.Web.Http.Dispatcher.HttpControllerDispatcher(configuration);
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) {
if (!ValidateKey(request)) {
var response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
var task = new TaskCompletionSource<HttpResponseMessage>();
task.SetResult(response);
return task.Task;
}
return base.SendAsync(request, cancellationToken);
}
private bool ValidateKey(HttpRequestMessage message) {
var query = message.RequestUri.ParseQueryString();
string key = query["AppKey"];
return (AppKey == key);
}
}

然后重新编程程序正常执行
AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)的更多相关文章
- 【转载】 Tensorflow中padding的两种类型SAME和VALID
原文地址: https://blog.csdn.net/jasonzzj/article/details/53930074 -------------------------------------- ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- JavaScript中两种类型的全局对象/函数【转】
Snandy Stop, thinking is the essence of progress. JavaScript中两种类型的全局对象/函数 这里所说的JavaScript指浏览器环境中的包括宿 ...
- 协议中UART的两种模式 【转】
转自:http://wjf88223.blog.163.com/blog/static/3516800120104179327286/ ^^…… 协议栈中UART有两种模式:1.中断2.DMA 对于这 ...
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型
转自:https://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 概述 LOB 代表大对象数据,包括 BLOB 和 CL ...
- JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...
- .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格
一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...
随机推荐
- 两种计算和输出n内5要么9除尽互惠
#include<stdio.h> int main() { int i=0,n=0; float fSum=0; scanf("%d", &n); for ( ...
- Windows Phone 8.1 应用生命周期
原文:Windows Phone 8.1 应用生命周期 一.“后退键”不会终止应用 关于 Windows Phone 8.1 的应用生命周期,第一个要知道的关键就是:“后退键”不会终止应用! 在 8. ...
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源代码)
,400],[200,5],[100,77],[40,300]]) shape:显示(行,列)例:shape(group)=(4,2) zeros:列出一个同样格式的空矩阵,例:zeros(group ...
- .NET 各种问题汇总
1.i++ 与++i的区别 using System; class TestApp { public static void Main() { int i = 8; int count = ++i;/ ...
- MVC EF 修改 封装类 通用泛型方法(二)
修改 这个 方法 如下. 排除 null 值. /// <summary> /// 修改 多数 数据, 个别数据除外, proNames 不写 则是 修改全部 /// </summa ...
- jQuery基础---Ajax进阶
原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一 ...
- 企业办公即时通信软件TeamTalk
TeamTalk 一键部署方案:TTAutoDeploy TeamTalk 整套服务提供模块部署脚本和一键部署方案,主要模块有JDK,NGINX,PHP,PERCONA(MYSQL), REDIS ...
- Swift初探一
今天安装了一下Xcode6-Beta版,想来体验一下Swift的魅力:安装Swift系统最低版本号为:10.9.3 仅仅看看一点The Swift Programming Language,以下给大家 ...
- android:Fragment动画的东西
最近很多人来Fragment动画是很感兴趣,我将是一个样本给大家看. 既然做,我会做动画以下类型: 注入弹出动画:从""进入.从"上下左右"弹出,当然,你怎么组 ...
- memcpy源代码
7月22号去面试开发的职位,面试官先问我在以前项目中写了什么程序.我就巴拉巴拉的说了一堆写过的code,主要还是测试工具和自动化测试代码.之后让我写memcpy的函数,面试官还挺好的,帮我把函数原型都 ...