Получение нулевого метода Post, когда содержание запроса превышает определенный размер - PullRequest
0 голосов
/ 13 июня 2018

Прежде всего, размер содержимого запроса, вызывающий это 632 байта, поэтому я не думаю, что он связан с параметром maxRequestLength.Я пытался увеличить это, и это не помогло.Содержимое запроса доступно через ReadAsStreamAsync, поэтому IIS не блокирует его.

У меня есть контроллер с методом Post, который принимает объект класса.Это всегда работает с моей машины разработки и большую часть времени работает на нашем сервере QA под IIS.Это выглядит как -

[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 байта, в PostSend будет передан ноль

1 Ответ

0 голосов
/ 29 июня 2018

Так что получается, что в производстве и QA у нас есть сервер на основе узлов, который передает запросы.Это передает запрос в форме Chunked.

В 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...