我们在开发完Asp.Net WebAPI程序后,可以使用WebHost寄宿方式或者SelfHost寄宿方式来部署Asp.Net WebAPI。所谓WebHost寄宿就是通过Asp.Net来实现;所谓SelfHost就是可以通过控制台、WinForm、WPF等方式寄宿。下面我们通过简单的例子来看看WebHost方式和SelfHost方式。

该Demo中包含一个类库项目、一个控制台项目以及一个空的WebForm项目。其中类库项目有一个继承自ApiController的名为HomeController的类;控制台项目实现SelfHost;WebForm项目实现WebHost:

WebAPI代码:

    public class HomeController : ApiController
{
public string Get(string fromStr)
{
return $"The request is from {fromStr}";
}
}

WebHost寄宿方式:

WebHost项目的Global文件代码:

    public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configuration.Routes.MapHttpRoute(name: "default", routeTemplate: "api/{controller}/{fromStr}");
}
}

启动运行WebHost项目,浏览器输入地址http://localhost:34827/api/home/webhost:

SelfHost寄宿方式:

SelfHost项目中的Program文件代码:

        static void Main(string[] args)
{
Assembly.Load("WebAPI,Version=1.0.0.1,Culture=neutral,PublicKeyToken=null"); HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://localhost:34827/");
using (HttpSelfHostServer server = new HttpSelfHostServer(configuration))
{
server.Configuration.Routes.MapHttpRoute(name: "default", routeTemplate: "api/{controller}/{fromStr}");
server.OpenAsync(); Console.Read();
}
}

启动运行SelfHost项目,浏览器输入地址http://localhost:34827/api/home/from_selfhost:

从上面的例子可以看到Asp.Net WebAPI可以有多重寄宿方式,而Asp.Net WebAPI可以实现多种寄宿方式的原因在于:Asp.Net WebAPI有一个独立于寄宿环境的抽象管道,这个抽象管道是Asp.Net WebAPI的消息处理管道。

下面正式进入今天的主题:Asp.Net WebAPI消息处理管道。Asp.Net WebAPI的消息处理管道是一组HttpMessageHandler的有序组合。在这个消息处理管道中,除了最后一个HttpMessageHandler外,其他的都是由DelegatingHandler这个类型组成的委托链,最后一个HttpMessageHandler是最终处理请求(查找Controller、执行Action)的地方。下面我们通过翻看源码来看看组成消息处理管道的这个有序组合都是哪些类型:

在了解完组成Asp.NetWebAPI消息处理管道的类型后,我们通过一个例子来看看是怎么组成的。我们改一下前面的例子,在WebAPI项目中添加两个自定义的HttpMessageHandler和自定义的HttpServer作为“龙头”:

    public class MyHttpMessageHanlder1 : DelegatingHandler
{
} public class MyHttpMessageHanlder2 : DelegatingHandler
{
} public class MyHttpServer:HttpServer
{
public MyHttpServer(HttpConfiguration configuration):base(configuration)
{ } public new void Initialize()
{
base.Initialize();
}
}

修改HomeController的代码:

    public class HomeController : ApiController
{
public Tuple<IEnumerable<string>, IEnumerable<string>> Get(string fromStr)
{
HttpConfiguration configuration = new HttpConfiguration();
configuration.MessageHandlers.Add(new MyHttpMessageHanlder1());
configuration.MessageHandlers.Add(new MyHttpMessageHanlder1()); MyHttpServer server = new MyHttpServer(configuration); IEnumerable<string> handler1 = GetHandlers(server).ToArray();
server.Initialize();
IEnumerable<string> handler2 = GetHandlers(server).ToArray(); return new Tuple<IEnumerable<string>, IEnumerable<string>>(handler1, handler2);
} private IEnumerable<string> GetHandlers(DelegatingHandler handler)
{
yield return handler.GetType().Name;
while (handler.InnerHandler != null)
{
yield return handler.InnerHandler.GetType().Name;
handler = handler.InnerHandler as DelegatingHandler;
if (handler == null)
break;
}
}
}

运行程序后输入地址http://localhost:34827/api/home/from:

由上面的例子,我们验证了HttpServer为消息处理管道的“龙头”,HttpRoutingDispatcher为管道的“龙尾”,我们自定义的委托链接点是保存在HttpConfiguration类型的MessageHanlers属性中,在HttpServer调用Initialize方法时把MessageHandlers中的委托链节点和“龙头”、“龙尾”组成一个消息处理管道委托链。

通过上面的实例我们知道了组成Asp.Net WebAPI消息处理管道的类型和验证了Asp.Net WebAPI消息处理管道的创建,下面我们继续看看作为消息处理管道的“龙头”和“龙尾”内部都做了些什么。

当请求流转到消息处理管道的最后一个节点时,通过源码,如下,我们可以看到在最后的节点中完成的动作是:根据RouteData找到对应的Controller和Action,然后执行Action,将得到的响应数据逆序流转到“龙头”HttpServer中,在有HttpServer返回给客户端。

总结:

通过前面的剖析,我们知道Asp.Net WebAPI有多种寄宿方式,是因为它有一个独立于寄宿环境的消息处理管道,然后我们也对组成Asp.Net WebAPI消息处理管道的各种类型进行了剖析,并从中发现了消息处理管道是如何创建、请求是如何在管道中流转以及各个管道的作用。

至此,我们对Asp.Net WebAPI消息处理管道进行了一个简单的剖析,由于个人能力有限,如有不对,欢迎指正。

细说Asp.Net WebAPI消息处理管道的更多相关文章

  1. WebApi学习总结系列第五篇(消息处理管道)

    引言: ASP.NET WebAPI的核心框架是一个消息处理管道,这个管道是一组HttpMessageHandler的有序组合.这是一个双工管道,请求消息从一端流入并依次经过所有HttpMessage ...

  2. ASP.NET Web API 框架研究 Self Host模式下的消息处理管道

    Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...

  3. 细说Asp.Net Web API消息处理管道(二)

    在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...

  4. ASP.NET Web API 框架研究 Web Host模式下的消息处理管道

    寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...

  5. ASP.NET Web API实践系列05,消息处理管道

    ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的 ...

  6. ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇]

    ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇] 我们知道ASP.NET Web API借助于HttpSelfHostServer以Self Host模式寄宿于当 ...

  7. ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇]

    ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇] ASP.NET Web API服务端框架核心是一个独立于具体寄宿环境的消息处理管道,它不关心请求消息来源于何 ...

  8. ASP.NET Web API的消息处理管道: HttpRoutingDispatcher

    ASP.NET Web API的消息处理管道: HttpRoutingDispatcher 认情况下,作为消息处理管道“龙头”的HttpServer的Dispatcher属性返回一个HttpRouti ...

  9. ASP.NET Web API的消息处理管道:"龙头"HttpServer

    ASP.NET Web API的消息处理管道:"龙头"HttpServer 一般来说,对于构成ASP.NET Web API消息处理管道的所有HttpMessageHandler来 ...

随机推荐

  1. Android相关修改教程

    ICS: 自己动手实现接通震动功能 原生来电归属地修改教程

  2. php smarty

     摘自:http://linux.chinaitlab.com/PHP/38324.html 刚开始接触模版引擎的 PHP 设计师,听到 Smarty 时,都会觉得很难.其实笔者也不例外,碰都不敢碰一 ...

  3. Spring AOP进行日志记录,管理

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...

  4. Java学习(一)

    各种原因就开始java开发快一个月了.一直也没有正式记录一下...现在开始..O(∩_∩)O~.... 先小结一下学习以来遇到的几个问题: 1.myeclipse的常用快捷键: F2当鼠标放在一个标记 ...

  5. IOS开发中如何给UIImageView添加点击事件

    1.先创建一个UIImageView控件: photeImageView = [[UIImageView alloc]init]; photeImageView.frame = CGRectMake( ...

  6. Centos7.2 编译安装PHP7

    PHP7,编译安装: 环境:centos7.2    (注意:因为我用的nginx, 此配置参数没有考虑到apache,所以不合适需要用apache的朋友照搬过去运行,但是可以参考.)   直接下载P ...

  7. Unity3d学习 基础-关于MonoBehaviour的生命周期

    其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解.而且在刚开始就接触Unity3D时,看到所有脚本中编 ...

  8. UVa 594 - One Little, Two Little, Three Little Endians

    题目大意:大小端模式的转换.所谓的小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中.与此相对,所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内 ...

  9. 安卓 webview背景色的设置

    第一步:webview的xml属性设置:android:layerType = "software"(关闭webview硬件加速,颜色设置才可以起效果) 第二步:webview所在 ...

  10. java监听事件

    2014年2月23日 09:51:54 成功添加了打开官网的事件, 回头研究下,那个打开url的类 java的System.getProperty()方法可以获取的值 ################ ...