4

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

4

1 回答 1

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;
    }
于 2013-02-20T17:33:52.340 回答