asp.net – 使用HttpRequestMessage.Properties传递每个请求的上下文

前端之家收集整理的这篇文章主要介绍了asp.net – 使用HttpRequestMessage.Properties传递每个请求的上下文前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Web API应用程序中,我使用Castle Windsor提供使用PerWebRequest生命周期配置的服务,并且一切正常在IIS上运行.

但是,当我使用ASP.NET Web API Self Host(Beta)package时,我需要创建一个自定义生命周期,以便根据HTTP请求确定这些服务的范围.

如何使用HttpRequestMessage.Properties携带每个请求上下文?

解决方法

我建议你使用消息处理程序将你的对象设置为HttpRequestMessage.Property:
  1. public class MyApplication : HttpApplication
  2. {
  3. protected void Application_Start()
  4. {
  5. RegisterHttpMessageHandlers(GlobalConfiguration.Configuration);
  6. }
  7. public void RegisterHttpMessageHandlers(HttpConfiguration config)
  8. {
  9. config.MessageHandlers.Add(new MyMessageHandler());
  10. }
  11. }
  12.  
  13. public static class MyHttpMessageHandlerExtensions
  14. {
  15. public static class HttpPropertyKey
  16. {
  17. public static readonly string MyProperty = "MyCompany_MyProperty";
  18. }
  19.  
  20. public static MyContext GetContext(this HttpRequestMessage request)
  21. {
  22. return (MyContext)request.Properties[HttpPropertyKey.MyProperty ];
  23. }
  24.  
  25. public static void SetContext(this HttpRequestMessage request,MyContext ctx)
  26. {
  27. request.Properties[HttpPropertyKey.MyProperty] = ctx;
  28. }
  29. }
  30. public class MyMessageHandler : DelegatingHandler
  31. {
  32. protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
  33. {
  34. request.SetContext(new MyContext(){/*some your data*/});
  35. return base.SendAsync(request,cancellationToken);
  36. }
  37. }
  38.  
  39. public class MyController: ApiController
  40. {
  41. public object GetData()
  42. {
  43. MyContext ctx = this.Request.GetContext(); // the extenstion method is used
  44. }
  45. }

猜你在找的asp.Net相关文章