如何全局访问当前的HttpRequestMessage对象?

时间:2013-05-21 12:43:36

标签: c# asp.net-mvc asp.net-web-api asp.net-mvc-routing

我有一个方法可以创建一个包含Error对象的HttpResponseMessage,该对象将根据当前的请求媒体类型格式化程序返回。

目前,我已经对XmlMediaTypeFormatter进行了硬编码,但我希望能够在运行时找到当前请求MediaTypeFormatter,但由于我的下面代码存在于单独的类库中,因此我无法访问当前请求对象。 / p>

private HttpResponseMessage Create(HttpStatusCode statusCode, string errorCode, string errorMessage)
{
    var result = new HttpResponseMessage(statusCode)
        {
            Content = new ObjectContent<Error>(new Error()
            {
                Code = errorCode,
                Message = errorMessage
            }, new XmlMediaTypeFormatter())
        };
    return result;
}

如何全局访问当前的HttpRequestMessage对象?类似于HttpContext.Current.Request

如果不可能,如何实现上述方法,以便它知道当前请求应该使用哪个格式化程序?

3 个答案:

答案 0 :(得分:70)

这不是我最近发现的并非不可能的事。它实际上被添加到当前HttpContext的Items属性中(如果有的话)= [

HttpRequestMessage httpRequestMessage = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage

修改

这是WebAPI v2的版本。我无法确定以前的版本。

答案 1 :(得分:1)

为什么不执行Web API团队使用其CreateResponse方法所做的事情?使其成为Controller的扩展方法。这样,您仍然可以将代码放在单独的类库中,但是您的方法可以访问控制器实例,因此可以访问所有配置信息。

稍微不同的是,我建议你研究一些标准化的错误响应工作,而不是发明自己的错误。

e.g:

答案 2 :(得分:0)

您可以尝试使用Autofac将其存档,例如

public class MyPrincipal : IPrincipal
    {
        private readonly IPrincipal principal_;

        public MyPrincipal(ILifetimeScope scope)
        {
            if (scope.Tag == null || scope.Tag != MatchingScopeLifetimeTags.RequestLifetimeScopeTag)
            {
                throw new Exception("Invalid scope");
            }

            principal_ = scope.Resolve<HttpRequestMessage>().GetRequestContext().Principal;
        }
}

可以使用InstancePerRequest生存期注册该类。

   builder.RegisterType<MyPrincipal>().As<IPrincipal>().InstancePerRequest();