HttpContext.Current WebContentTypeMapper / GetMessageFormatForContentType 中为空

HttpContext.Current null in WebContentTypeMapper / GetMessageFormatForContentType

我想写一个 WebContentTypeMapper returns WebContentFormat 依赖于 uri 路径。

到现在为止我用的是HttpContext.Current.Request.PathInfo。 但是如果有大量的 POST-请求正文超过 64k 那么 HttpContext.Current 是空的。

我发现 HttpContext.Current 不打算在那里使用。但它适用于所有其他情况,当请求只有几 kb 小的时候。

有没有其他方法可以在GetMessageFormatForContentType()中找到当前请求的路径?

public class RawContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        string pathInfo;
        try
        {
            pathInfo = HttpContext.Current.Request.PathInfo;
        }
        catch (NullReferenceException e)
        {
            // This happens for large POST requests
            pathInfo = ...please help!
        }
        switch (pathInfo)
        {
            case "/abc/path1":
            case "/abc/path2":
                return WebContentFormat.Raw;
            default:
                return WebContentFormat.Default; // No change to default behavior
        }
    }
}

我现在有办法了。由几个变化组成:

我将 RawContentTypeMapper 更改为始终 return WebContentFormat.Raw

Web.config:

  • 添加了使用 RawContentTypeMapper 的绑定副本并删除了 contentTypeMapper 属性。所以它使用默认映射器。

  • 通过使用 RawContentTypeMapper 的绑定向每个地址 ("abc/path1"...) 添加了一个端点。

  • 使用默认绑定向基地址 "abc" 添加了一个端点。

IMySourceCode.cs:MySourceCode.cs:

UriTemplate = "" 创建了一个新的 OperationContract。在那里,我检查 HttpContext.Current.Request.PathInfo 是否有 "abc/path1/"、"abc/path2/"... 并调用原始的 OperationContract 方法。

为此,所有 OperationContracts 必须具有相同的签名(此处为 void MyMethod(Stream data))。

添加了 Global.asax 以将路径 "abc/path1" 重写为 "abc/path1/"...:[=​​18=]

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var pathInfo = HttpContext.Current.Request.PathInfo.ToLowerInvariant();
        if (pathInfo.StartsWith("/abc/"))
        {
            foreach (var s in new[] { "/abc/path1", "/abc/path2" })
            {
                if (pathInfo == s)
                {
                    var rawUrl = HttpContext.Current.Request.RawUrl.ToLower(CultureInfo.InvariantCulture);
                    HttpContext.Current.RewritePath($"{rawUrl}/");
                    break;
                }
            }
        }
    }