docker / linux aspnet core 2.03 усечение данных поста. Как это возможно? - PullRequest
0 голосов
/ 03 мая 2018

Я в растерянности и приветствую любые советы. Этот код обманчиво прост, но Async может усложнить ситуацию и вызвать проблемы.

Метод POST работает, когда байты данных меньше чем 3802. Данные усекаются в 3800 или 3801, когда данные POST больше чем 3802. Нам потребовалось некоторое время, чтобы поймать нас, потому что большая часть данных времени <3800. Я наконец добавил отладочную логи и увидел отключение. </p>

Я занимался дополнительным чтением в асинхронном режиме и в настоящее время не верю, что этот код имеет проблему. Я знаю, что async void вызовет пожар и забудет, но у нас есть попытка / отлов, поэтому я ожидаю, что ошибки будут отображаться в журналах без исключения всей программы из-за исключения. Я бы приветствовал предложения по улучшению, однако.

[HttpPost("{instance}/{objectType}")]
    public async void Post(  [FromRoute] string instance,  [FromRoute] string objectType )
    {
        Log.Debug("Incoming post(instance/objectype)");
        string content = "";
        try
        {
            using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
            {
                // have a scenario where conlen below is always cut off at 3800 or 3801 bytes
                // wild guess is that it is a async/threadpool issue?
                content = await reader.ReadToEndAsync();
            }

            var conlen = (content != null) ? content.Length : 0;
            var contentbegin = (content != null) ? content.Substring(0, Math.Min(conlen, 80)) : "";
            Log.Debug("POST {objecttype} {contentlen} {contentbegin}", objectType, conlen, contentbegin);

            await ProcessPost(objectType, content, instance);
        }
        catch (Exception ex)
        {
            Log.Error("Exception in Post {msg} {trace}", ex.Message, ex.StackTrace);
            Log.Error("Exception in Post offending message {msg} ", content);
        }

    }

Вот пример журналов. Вы можете видеть, что размер данных> 3800, но, увы, нас отключают, когда мы собираемся их прочитать.

[19:27:57 INF] Request starting HTTP/1.0 POST http://backend.example.com/orderinput application/json 5459
[19:27:57 INF] Executing action method Controllers.ValuesController.Post (Test) with arguments (["Production", "orderinput"]) - ModelState is Valid
[19:27:57 DBG] Incoming post(instance/objectype)
[19:27:57 INF] Executed action Controllers.ValuesController.Post (Test) in 0.4701ms
[19:27:57 INF] Request finished in 0.789ms 200 
[19:27:57 DBG] POST orderinput 3801 {"SAMPLE":"1234567890......... 
[19:27:57 DBG] Enter ProcessPost
[19:27:57 DBG] Persisting post
[19:27:57 ERR] Exception in ProcessPost DB Persist Unexpected end of content while loading JObject. Path 'customer_id', line 1, position 3801. 

редактирует:

ПОЧЕМУ Я ДУМАЮ, ЧТО ЭТОТ КОДЕКС - ВОПРОС?

В конце строки 1 в журналах ASP.NET полезно указать длину содержимого 5459. В строке 6 есть мой расчет, и он показывает 3801. Эти два числа всегда одинаковы, если длина не превышает 3802.

КАК ПРЕДОСТАВЛЯЕТСЯ ДАННЫЕ? Я пытался делать это так?

Данные поступают из другого веб-сервиса, не находящегося под моим контролем, через прокси-сервер NGINX. Спасибо за предложение, я буду использовать его как с прокси-сервером, так и без него, выше и ниже 3802, и сообщу о результатах здесь. Учитывая несоответствие между журналами ASP.NET и моими расчетами, кажется, что это далеко, но все дороги стоят того, чтобы идти вниз.

1 Ответ

0 голосов
/ 27 июня 2019

Я выбросил кодовую базу, написанную другим разработчиком, и начал заново, чтобы решить эту проблему. Я думаю, что тот факт, что синхронизация / асинхронность смешивались без разбора, был проблемой, и этот странный симптом был результатом. Я использовал nito asyncex в своем окончательном решении, чтобы изолировать библиотеку кроликов от вызовов Async, и для веб-API Asp.Net у меня была вся входящая передача данных в очередь, и очередь работала в отдельном потоке, который исключительно общался с кроликом. Никаких проблем со времени переписывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...