首先,触发此请求内容大小为632字节,因此我不相信它与maxRequestLength参数相关。我试过增加这个并没有帮助。请求内容可通过ReadAsStreamAsync获得,因此它不是IIS阻止它。
我有一个带有Post方法的控制器,它接受一个类对象。这总是适用于我的开发机器,大部分时间它都适用于IIS下的QA服务器。它看起来像 -
[RoutePrefix("api/message")]
public class MessageController : ApiController
{
[Route("send")
public async Task<SendMessageResponse> PostSend([FromBody] SendMessageRequest request)
{
...
SendMessageRequest看起来像 -
public class SendMessageRequest
{
public string[] sendTo { get; set; }
public string subject { get; set; }
public string body { get; set; }
}
但是,当请求内容超过632个字符时,PostSend会收到null作为请求参数。可以使用Newtonsoft.JSON手动拉取请求流和序列化。
有什么想法吗?
谢谢, 赫
*示例请求内容
{
"subject" : "Test Message",
"sendTo" : [ "hector@employer.com" ],
"body" : "...Long String..."
}
更改主题或正文以使请求内容超过632个字节将导致将null传递给PostSend
答案 0 :(得分:1)
因此,在生产和质量检查中,我们有一个基于节点的服务器来代理请求。这样会将请求以块形式传递。
WebApi v2.1中似乎存在一个错误,该错误按照https://forums.asp.net/t/1978292.aspx处理了分块的请求。
解决方案是在将反序列化器设置为request.Content.Headers.ContentLength = null的反序列化器之前添加一些内容。
即
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Headers.TransferEncodingChunked.HasValue
&& request.Headers.TransferEncodingChunked.Value)
{
request.Content.Headers.ContentLength = null;
}
return base.SendAsync(request, cancellationToken);
}