在WebAPI服务中,我们使用格式化程序来读取请求的内容参数。我们需要访问URL才能正确转换content参数。 HttpRequestMessage不可用,我们不能使用HttpContext.Current.Request,因为HttpContext.Current为null。在http://aspnetwebstack.codeplex.com/workitem/82上请求了对Read上的HttpRequestMessage的访问,但是由于HttpContent在Read上可用,因此已关闭此问题。但是,我不知道如何从HttpContent获取URL,或者即使有可能也不知道。

最佳答案

格式化程序上有一个称为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;
    }

09-30 19:50