【发布时间】:2020-08-12 19:55:11
【问题描述】:
好吧,所以我一直在绞尽脑汁,终生无法理解为什么完全相同的代码在 .Net Core 2.2 中完美运行,但在 .Net Core 3.0 中返回一个空字符串。
我正在运行的代码是这样的:
public static async Task<string> GetRequestBodyAsync(this HttpRequest request,
Encoding encoding = null)
{
if (encoding == null) encoding = Encoding.UTF8;
var body = "";
request.EnableBuffering();
if (request.ContentLength == null || !(request.ContentLength > 0) || !request.Body.CanSeek) return body;
request.Body.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(request.Body, encoding, true, 1024, true))
body = await reader.ReadToEndAsync();
request.Body.Position = 0;
return body;
}
我这样称呼这个扩展:
var bodyContent = await Request.GetRequestBodyAsync();
var body = new MemoryStream(Encoding.UTF8.GetBytes(bodyContent));
在 .Net Core 2.2 中,我得到了我想要的已发送负载的正文,但在 .Net Core 3.0 中,我得到了一个空字符串。
我在启动时使用扩展程序将 Newtonsoft 添加到我的 .Net Core 3.0 项目中,但如果我删除它仍然无法工作。
任何想法我可能做错了什么?
【问题讨论】:
-
似乎您的函数正在返回中间的那个 if 语句。尝试单步执行代码或在整个过程中添加一些日志语句,以确定哪个条件失败以及是否达到了
body = await reader.ReadToEndAsync();行。 -
条件
if (request.ContentLength == null || !(request.ContentLength > 0) || !request.Body.CanSeek)中的值是什么 -
@Klaycon
await reader.ReadToEndAsync();已到达并到达最后一行但仍返回""; -
@Train ContentLength 在这种情况下是 243 CanSeek 是真的。
标签: c# .net-core .net-core-3.0