我的情景:
我正在使用ASP .NET 5 Web API,而我正在使用content-type: application/json
将数据发布到服务器。
消息:
Request headers
{...}
Content-Type:application/json
{...}
Request payload
{"Property1":"2280910","Property2":"734"}
MyController方法:
[HttpPost]
public MyClassOutput GetDataRequest([FromBody] GetDataInput input) { ... }
我覆盖了OnException
类中的ExceptionFilterAttribute
方法,该方法为我提供了ExceptionContext
个实例。我想从异常日志记录请求中获取参数值。我试图读取身体内容,但它是空的。
public override void OnException(ExceptionContext context)
{
JsonSerializer serializer = new JsonSerializer();
var content = context.HttpContext.Request;
using (var stream = new StreamReader(content.Body, Encoding.UTF8))
using(var jsonTextReader = new JsonTextReader(stream))
{
var bodyContent = serializer.Deserialize(jsonTextReader);
if (bodyContent != null)
exceptionData.Parameters = bodyContent.ToString();
}
}
有人可以给我指示吗?
答案 0 :(得分:2)
我假设您为异常处理创建了自己的属性,实现了ExceptionFilterAttribute
和覆盖OnException(HttpActionExecutedContext actionExecutedContext)
方法。基本上,您必须将内容流中的位置恢复为0,因为在调用正确的控制器方法时框架已经读取了该位置。您的代码应如下所示:
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
var content = actionExecutedContext.Request.Content;
using (var streamReader = new StreamReader(content.ReadAsStreamAsync().Result))
{
streamReader.BaseStream.Position = 0;
using (var jsonReader = new JsonTextReader(streamReader))
{
var serializer = JsonSerializer.Create();
var parameters = serializer.Deserialize<GetDataInput>(jsonReader);
}
}
}
答案 1 :(得分:0)
由于ASP .NET实现模型绑定过程的方式,您无法读取内容流两次,因此我找到的获取参数值的解决方案位于context.ModelState.Values
属性中。就这么简单......(我之前没有意识到这一点)。