总体介绍ASP.NET Web API下Controller的激活与释放流程
2014-04-14 22:17
465 查看
总体介绍ASP.NET Web API下Controller的激活与释放流程
[code] public static class HttpRequestMessageExtensions
{
//其他成员
public static IEnumerable<IDisposable> GetResourcesForDisposal(this HttpRequestMessage request);
public static void RegisterForDispose(this HttpRequestMessage request, IEnumerable<IDisposable> resources);
public static void RegisterForDispose(this HttpRequestMessage request,IDisposable resource);
public static void DisposeRequestResources(this HttpRequestMessage request);
}
[/code]
[/code]
ASP.NET Web API还为释放这些附加到HttpRequestMessage上的对象定义了如上一个扩展方法DisposeRequestResources,那么这个方法究竟是在什么时候被调用的呢?
释放这些资源的时机取决于采用的寄宿模式。对于Web Host来说,ASP.NET Web API用于“处理请求、回复响应”的HttpMessageHandler管道是由HttpControllerHandler创建的,后者根据当前HTTP上下文创建一个表示当前请求的HttpRequestMessage对象并传入这个管道进行处理。在整个管道完成对请求的处理并最终对请求予以响应之后,HttpControllerHandler会负责完成如下三项与资源释放有关的工作。
调用HttpRequestMessage对象的扩展方法DisposeRequestResources释放附加在自身属性字典中的对象。
调用HttpRequestMessage对象的Dispose方法对请求消息本身作相应的释放工作。
调用返回的HttpResponseMessage对象对响应消息作相应的释放工作。
对于Self Host来说,通过《Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?》的介绍我们知道请求的监听、接收和响应是通过HttpBinding创建的信道栈来完成的。该信道栈处理的消息类型为HttpMessage,具体代表请求消息和响应消息的HttpMessage分别是对HttpRequestMessage和HttpResponseMessage对象的封装。WCF中表示消息的Message本身就是一个需要最终被释放的对象,在针对它的处理结束之后会调用其Close或者Dispose方法对它进行资源释放的工作。
当一个HttpMessage对象的Close或者Dispose方法被调用的时侯,被其封装的HttpRequestMessage或者HttpResponseMessage会相应地得到释放。对于请求消息来说,具体的资源释放工作包括针对HttpRequestMessage自身的释放和对附加到属性字典中资源的释放。
我们不妨通过一个简单的实例来演示Self Host寄宿模式下伴随着HttpMessage对象的释放对被封装的HttpRequestMessage对象的释放。我们在一个控制台应用中定义了如下三个需要被释放的类型Foo、Bar和Baz,它们共同的基类DisposableObject实现了IDisposable接口,并在实现Dispose方法中通过输出一段文字以确定具体的释放操作是否被执行。
[code] [code] public class DisposableObject : IDisposable
{
public void Dispose()
{
Console.WriteLine("{0}.Dispose()", this.GetType().Name);
}
}
public class Foo : DisposableObject
{}
public class Bar : DisposableObject
{}
public class Baz : DisposableObject
{}
[/code]
[/code]
然后我们再Main方法中编写了如下一段简短的程序。我们分别创建了类型为Foo、Bar和Baz的三个对象,并通过调用扩展方法RegisterForDispose将它们注册到创建的HttpRequestMessage对象上。我们针对这个HttpRequestMessage对象利用反射的方式创建了一个HttpMessage对象,最终调用其Close方法对它作相应的释放工作。
[code] [code] class Program
{
static void Main(string[] args)
{
HttpRequestMessage request = new HttpRequestMessage();
request.RegisterForDispose(new Foo());
request.RegisterForDispose(new Bar());
request.RegisterForDispose(new Baz());
Type httpMessageType = Type.GetType("System.Web.Http.SelfHost.Channels.HttpMessage, System.Web.Http.SelfHost");
Message httpMessage = (Message)Activator.CreateInstance(httpMessageType, new object[]{ request});
httpMessage.Close();
}
}
[/code]
[/code]
我们运行这段程序后会控制台上得到如下的输出结果,由此可见通过调用扩展方法RegisterForDispose注册到某个HttpRequestMessage对象上的资源能够在它释放的时候得到释放。(S406)
[code] [code] Foo.Dispose()
Bar.Dispose()
Baz.Dispose()
[/code]
[/code]
对于ApiController来说,当它的ExecuteAsync方法被执行的时候,它会调用扩展方法RegisterForDispose将自己注册到代表当前请求的HttpRequestMessage对象上。毫无疑问,ApiController对象的释放会通过对这个HttpRequestMessage的释放来完成。
相关文章推荐
- 总体介绍ASP.NET Web API下Controller的激活与释放流程
- ASP.NET MVC Controller激活系统详解:总体设计
- ASP.NET Web API下Controller激活
- 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的创建
- ASP.NET MVC Controller激活系统详解:总体设计
- ASP.NET Web API的HttpController是如何被激活的?
- ASP.NET Web API下的HttpController激活:程序集的解析
- 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择
- ABP(现代ASP.NET样板开发框架)系列之1、ABP总体介绍
- ASP.NET Web API 路由对象介绍
- ASP.NET Web API教程 创建域模型的方法详细介绍
- Asp.Net构架(Http请求处理流程)、(Http Handler 介绍)、(HttpModule 介绍)
- 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
- ASP.NET Web API的Controller是如何被创建的?
- Asp.net MVC的Controller激活理解【学习笔记】
- ASP.NET Web API教程 创建Admin视图详细介绍
- [ASP.NET Web API]如何Host定义在独立程序集中的Controller
- ASP.NET WEB API处理流程
- ASP.NET Web API教程 创建Admin视图详细介绍
- ASP.NET MVC Controller激活系统详解