C# docker/linux aspnet core 2.03截断post数据。这怎么可能?

C# docker/linux aspnet core 2.03截断post数据。这怎么可能?,c#,linux,docker,asp.net-core,C#,Linux,Docker,Asp.net Core,我不知所措,欢迎任何建议。这段代码看似简单,但异步可能会使事情复杂化并引发问题 POST方法在数据字节小于3802时工作。当POST数据大于3802时,数据在3800或3801处截断。我们花了一段时间才明白这一点,因为大多数时间数据都小于3800。我最终添加了调试日志并看到了断开连接 我一直在做额外的异步阅读,目前不认为这段代码有问题。我知道async void会导致fire and forget,但是我们有一个try/catch,所以我希望在日志中显示错误,而不会因为异常而导致整个程序退出。不

我不知所措,欢迎任何建议。这段代码看似简单,但异步可能会使事情复杂化并引发问题

POST方法在数据字节小于3802时工作。当POST数据大于3802时,数据在3800或3801处截断。我们花了一段时间才明白这一点,因为大多数时间数据都小于3800。我最终添加了调试日志并看到了断开连接

我一直在做额外的异步阅读,目前不认为这段代码有问题。我知道async void会导致fire and forget,但是我们有一个try/catch,所以我希望在日志中显示错误,而不会因为异常而导致整个程序退出。不过,我欢迎提出改进建议

[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,否则这两个数字始终相同

如何提交数据?我试过这样做吗


数据来自另一个不受我控制的web服务,通过NGINX代理。感谢您的建议,我将在有代理和无代理的情况下,在3802以上和以下,执行此操作,并在此处报告结果。考虑到ASP.NET日志和我的计算之间的脱节,这似乎是一个很长的机会,但所有的路都值得走下去。

我扔掉了另一个开发人员编写的代码库,从头开始解决这个问题。我认为sync/async被不分青红皂白地混合是问题所在,而这个奇怪的症状就是结果。在我的最终解决方案中,我使用nito asyncex将rabbit库与异步调用隔离开来,对于Asp.Net web API,我将所有传入的数据发布到一个队列,队列运行在一个单独的线程中,该线程专门与rabbit对话。重写后没有任何问题。

是什么让您认为这段代码是问题所在?如果发布到非异步方法,会发生什么?你为什么不怀疑打电话的人?如果使用调试代理(如Fiddler),会发生什么情况?这会看到什么?如何提交数据?如果你从邮递员那里发送10公里的有效载荷,会发生什么?