WebAPI 读取Request的InputStream

时间:2014-12-18 14:59:03   收藏:0   阅读:865

最近的项目有一个需求,就是在每个Request开始的时候,读取每个Request的body中的内容,做些Logging,然后再根据Route分别处理。

大概是这个样子

[HttpPost]
[Route("api/{id}/add")]
public HttpResponseMessage Add(string id, [FromBody]string body)
{
   ...
}

为了在每个Request开始的时候做logging,只要在Global.asax.cs的Application_BeginRequst中做相应处理

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var request = ((HttpApplication)sender).Request;
    string content;

    using (var reader = new StreamReader(request.InputStream))
    {
        content = reader.ReadToEnd();
    }
    
    ...
}

这样虽然可以拿到request.InputStream中的内容,但是却进不去Add函数了,原因是WebAPI不能再从request.InputStream读取body的值。

即使我在Application_BeginRequest中把request.InputStream.Position = 0,还是不行。

 

造成这种情况可能的原因是,StreamReader在Dispose的时候,把request.InputStream也Dispose了。

 

解决办法

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var request = ((HttpApplication)sender).Request;
    string content;

    var bytes = new byte[request.InputStream.Length];
    request.InputStream.Read(bytes, 0, bytes.Length);
    request.InputStream.Position = 0;
    string content = Encoding.UTF8.GetString(bytes);
    
    ...
}

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!