如何使用ASP .NET 5从http请求中读取正文消息

时间:2016-01-28 17:33:30

标签: asp.net asp.net-web-api

我的情景:

我正在使用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();
   }
}

有人可以给我指示吗?

2 个答案:

答案 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属性中。就这么简单......(我之前没有意识到这一点)。