我有一个方法可以创建一个包含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
如果不可能,如何实现上述方法,以便它知道当前请求应该使用哪个格式化程序?
答案 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();