在 WebApi Core ActionFilter 中获取请求正文作为字符串?

Moh*_*yan 1 asp.net-web-api asp.net-core asp.net-core-webapi .net-core-2.0

以下是我在WebApi .Net Core 2项目中的ActionFilter:

[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();
    }
}
Run Code Online (Sandbox Code Playgroud)

requestHeader具有正确的值并且可以,但requestBody始终为空。
我通过将带有以下正文的请求发送到操作来测试它。

[
 {
  "TrackingCode": "96003445",
  "Description": "",
  "InnerMessage": "",
  "Status": 11
 },
 {
  "TrackingCode": "96003840",
  "Description": "",
  "InnerMessage": "Inner message",
  "Status": 11
 }
]
Run Code Online (Sandbox Code Playgroud)

如何在 WebApi Core 2 ActionFilter 中获取请求正文?

Moh*_*yan 6

通过@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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

效果很好