使用transfer-enconding进行POST:在IIS 8.5 Web API中,chunked失败

时间:2017-10-30 09:55:47

标签: 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 encoded http requests in ASP.NET

1 个答案:

答案 0 :(得分:1)

您必须基本上检查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);
    }
}

连接此格式化程序

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

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