紧接着前文Asp.net web Api源码分析-HttpRequestMessage的创建 HttpRequestMessage实例已经创建好了,现在我们来看看
Task responseBodyTask = _server.Value.SendAsync(request, CancellationToken.None)
.Then(response => ConvertResponse(httpContextBase, response, request));这里的_server.Value.SendAsync是真正处理http请求的,ConvertResponse只是处理结果而已的。我这里还是按早代码的执行顺序依次说吧。首先我们来看看这里的_server是个什么东东:
private static readonly Lazy<HttpMessageInvoker> _server =
new Lazy<HttpMessageInvoker>(
() =>
{
HttpServer server = new HttpServer(GlobalConfiguration.Configuration, GlobalConfiguration.DefaultHandler);
return new HttpMessageInvoker(server);
});
这里的_server是一个HttpMessageInvoker的实例,这里还需要一个HttpServer的变量。其中GlobalConfiguration的DefaultHandler定义如下:
private static Lazy<HttpMessageHandler> _defaultHandler = new Lazy<HttpMessageHandler>(
() => new HttpRoutingDispatcher(_configuration.Value));
public static HttpMessageHandler DefaultHandler
{
get { return _defaultHandler.Value; }
}
DefaultHandler属性其实是一个HttpRoutingDispatcher实例。这里我们首先看看HttpRoutingDispatcher的构造函数:
{
private readonly HttpConfiguration _configuration;
private readonly HttpMessageInvoker _defaultInvoker;
public HttpRoutingDispatcher(HttpConfiguration configuration)
: this(configuration, new HttpControllerDispatcher(configuration))
{
}
public HttpRoutingDispatcher(HttpConfiguration configuration, HttpMessageHandler defaultHandler)
{
_configuration = configuration;