【问题标题】:Carrying per-request context using the HttpRequestMessage.Properties使用 HttpRequestMessage.Properties 携带每个请求的上下文
【发布时间】:2012-05-20 17:57:47
【问题描述】:

在 Web API 应用程序中,我使用 Castle Windsor 提供配置了 PerWebRequest 生命周期的服务,并且在 IIS 上一切正常。

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

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

【问题讨论】:

    标签: asp.net dependency-injection castle-windsor asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    我建议您使用消息处理程序将一些对象设置为 HttpRequestMessage.Property:

    public class MyApplication : HttpApplication
    {
        protected void Application_Start()
        {
            RegisterHttpMessageHandlers(GlobalConfiguration.Configuration);
        }
        public void RegisterHttpMessageHandlers(HttpConfiguration config)
        {
            config.MessageHandlers.Add(new MyMessageHandler());
        }
    }
    
    public static class MyHttpMessageHandlerExtensions
    {
        public static class HttpPropertyKey
        {
            public static readonly string MyProperty = "MyCompany_MyProperty";
        }
    
        public static MyContext GetContext(this HttpRequestMessage request)
        {
            return (MyContext)request.Properties[HttpPropertyKey.MyProperty ];
        }
    
        public static void SetContext(this HttpRequestMessage request, MyContext ctx)
        {
            request.Properties[HttpPropertyKey.MyProperty] = ctx;
        }
    }
    public class MyMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.SetContext(new MyContext(){/*some your data*/});
            return base.SendAsync(request, cancellationToken);
        }
    }
    
    public class MyController: ApiController
    {
        public object GetData()
        {
            MyContext ctx = this.Request.GetContext(); // the extenstion method is used
        }
    }
    

    【讨论】:

    • 您永远不会在稍后的 API 调用中提及如何实际读取上下文。
    • @ShrikeMay 我建议让你的代码更通用?
    猜你喜欢
    • 2016-08-03
    • 2022-08-18
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2012-07-17
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多