在WebAPI服务中,我们使用Formatter来读取请求中的内容参数。我们需要访问URL才能正确转换内容参数。 HttpRequestMessage不可用,我们不能使用HttpContext.Current.Request,因为HttpContext.Current为null。在http://aspnetwebstack.codeplex.com/workitem/82请求在Read上访问HttpRequestMessage,但由于HttpContent在Read上可用,因此该问题已关闭。但是,我不知道如何从HttpContent获取URL,或者即使它是可能的。
答案 0 :(得分:3)
在格式化程序上有一个名为GetPerRequestFormatterInstance的方法,您可以覆盖该方法以创建格式化程序的新实例,其中包含有关请求的有状态信息。顺便说一下,只有在请求的反序列化阶段才会调用此方法GetPerRequestFormatterInstance。示例如下:
public class TextPlainFormatter : BufferedMediaTypeFormatter
{
public TextPlainFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
}
public HttpRequestMessage CurrentRequest
{
get;
private set;
}
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
{
TextPlainFormatter frmtr = new TextPlainFormatter();
frmtr.CurrentRequest = request;
//Copy from the original formatter instance to the new instance
frmtr.MediaTypeMappings.Clear();
foreach (MediaTypeMapping mediaTypeMapping in this.MediaTypeMappings)
{
frmtr.MediaTypeMappings.Add(mediaTypeMapping);
}
frmtr.RequiredMemberSelector = this.RequiredMemberSelector;
frmtr.SupportedEncodings.Clear();
foreach (Encoding supportedEncoding in this.SupportedEncodings)
{
frmtr.SupportedEncodings.Add(supportedEncoding);
}
frmtr.SupportedMediaTypes.Clear();
foreach (MediaTypeHeaderValue supportedMediaType in this.SupportedMediaTypes)
{
frmtr.SupportedMediaTypes.Add(supportedMediaType);
}
return frmtr;
}