下面是我在WebApi .Net Core 2项目中的.Net:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RequestLoggingAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
var request = actionContext.HttpContext.Request;
var route = request.Path.HasValue ? request.Path.Value : "";
var requestHeader = request.Headers.Aggregate("", (current, header) => current + $"{header.Key}: {header.Value}{Environment.NewLine}");
request.EnableRewind();
var requestBody = new StreamReader(request.Body).ReadToEnd();
}
}
requestHeader
有正确的值,它是可以的,但是requestBody
总是空的。
我用下面的正文向操作发送请求来测试它。
[
{
"TrackingCode": "96003445",
"Description": "",
"InnerMessage": "",
"Status": 11
},
{
"TrackingCode": "96003840",
"Description": "",
"InnerMessage": "Inner message",
"Status": 11
}
]
如何在WebApi核心2 ActionFilter中获得请求体?
发布于 2017-11-23 03:09:01
有了@Nkosi指南,我可以找到如下解决方案:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class RequestLoggingAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
var request = actionContext.HttpContext.Request;
var route = request.Path.HasValue ? request.Path.Value : "";
var requestHeader = request.Headers.Aggregate("", (current, header) => current + $"{header.Key}: {header.Value}{Environment.NewLine}");
var requestBody = "";
request.EnableRewind();
using (var stream = new StreamReader(request.Body))
{
stream.BaseStream.Position = 0;
requestBody = stream.ReadToEnd();
}
}
}
它工作得很好
https://stackoverflow.com/questions/47429002
复制相似问题