您的位置:首页 > 编程语言 > ASP

总体介绍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的释放来完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: