.Net Core 3.0 中的请求正文为空
Request body from is empty in .Net Core 3.0
好吧,我一直在绞尽脑汁,终其一生都无法理解为什么完全相同的一段代码在 .Net Core 2.2 中可以完美运行,但 returns 在 .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 项目中,但如果我删除它,它仍然不起作用。
知道我可能做错了什么吗?
在启动时添加这个中间件class:
app.Use((context, next) =>
{
context.Request.EnableBuffering();
return next();
});
我实际上弄明白了,在 controller-method 中,我使用 [FromBody]
读取正文,以便正文被读取两次,而不是第一次倒带。
public async Task<ActionResult<string>> PaymentRequestCallbackAsync(/*[FromBody] SecretModel model*/)
{
var body = await Request.GetRequestBodyAsync();
var stream = new MemoryStream(Encoding.UTF8.GetBytes(body));
return body;
}
所以删除 [FromBody]
它应该可以正常工作。
好吧,我一直在绞尽脑汁,终其一生都无法理解为什么完全相同的一段代码在 .Net Core 2.2 中可以完美运行,但 returns 在 .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 项目中,但如果我删除它,它仍然不起作用。
知道我可能做错了什么吗?
在启动时添加这个中间件class:
app.Use((context, next) =>
{
context.Request.EnableBuffering();
return next();
});
我实际上弄明白了,在 controller-method 中,我使用 [FromBody]
读取正文,以便正文被读取两次,而不是第一次倒带。
public async Task<ActionResult<string>> PaymentRequestCallbackAsync(/*[FromBody] SecretModel model*/)
{
var body = await Request.GetRequestBodyAsync();
var stream = new MemoryStream(Encoding.UTF8.GetBytes(body));
return body;
}
所以删除 [FromBody]
它应该可以正常工作。