gpt4 book ai didi

c# - docker/linux aspnet core 2.03 截断发布数据。这怎么可能?

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:30 25 4
gpt4 key购买 nike

我不知所措,欢迎任何和所有建议。此代码看似简单,但异步可能会使事情复杂化并导致问题。

POST 方法在数据字节小于 3802 时起作用。当 POST 数据大于 3802 时,数据在 3800 或 3801 处被截断。这对我们来说需要一段时间才能捕捉到,因为大多数时候数据小于 3800。我终于添加调试日志记录并看到断开连接。

我一直在做关于异步的额外阅读,目前不认为这段代码有问题。我知道 async void 会导致即发即弃,但我们有一个 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。

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

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

最佳答案

我扔掉了另一个开发人员编写的代码库,从头开始解决这个问题。我认为同步/异步被不加区别地混合的事实是问题所在,结果就是这种奇怪的症状。我在我的最终解决方案中使用了 nito asyncex 来将 rabbit 库与异步调用隔离开来,对于 Asp.Net web API,我将所有传入的数据发布到一个队列中,并且该队列在一个专门与 rabbit 通信的单独线程中运行。重写后完全没有问题。

关于c# - docker/linux aspnet core 2.03 截断发布数据。这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com