在WebAPI Formatter中,如何从HttpContent获取URL?

时间:2013-02-20 17:14:35

标签: asp.net-web-api

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

1 个答案:

答案 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;
    }