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 中获取请求正文?
通过@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)
效果很好
| 归档时间: |
|
| 查看次数: |
5595 次 |
| 最近记录: |