带有传输编码的 POST:在 IIS 8.5 Web API 中分块失败

Tuo*_*ash 7 asp.net iis request transfer-encoding

我在 IIS 8.5 上运行了 ASP.NET Web API,我的 POST 方法接受了一个 json 文档主体。现在客户端应用程序正在使用 apache httpclient,它显然会自动将 Transfer-Encoding: chunked 标头添加到请求中。由于主体不存在,我的 API 方法抛出异常 - 它无法反序列化主体中的 json,即使它在客户端日志中看起来不错。

我应该如何处理请求以确保我得到整个身体?我猜 IIS 也应该支持请求的传输编码,因为它是 HTTP/1.1 规范的一部分,对吧?

有一个类似的问题没有回答:Reading Body on chunked transfer encoding http requests in ASP.NET

Jer*_*eph 4

您必须检查 ContentLength 标头,如果为 0,则将其设置为 null。

public class ChunkJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        content.Headers.ContentLength = (content.Headers.ContentLength == 0) ? null : content.Headers.ContentLength;

        return base.ReadFromStreamAsync(type, readStream, content, formatterLogger);
    }
}
Run Code Online (Sandbox Code Playgroud)

连接此格式化程序

GlobalConfiguration.Configure(config =>
{
    var jsonFormatter = new ChunkJsonMediaTypeFormatter() { SerializerSettings = config.Formatters.JsonFormatter.SerializerSettings };
    config.Formatters.Remove(config.Formatters.JsonFormatter);
    config.Formatters.Insert(0, jsonFormatter);
}
Run Code Online (Sandbox Code Playgroud)

https://gist.github.com/jayoungers/0b39b66c49bf974ba73d83943c4b218b