首页 > 代码库 > WebAPI 读取Request的InputStream

WebAPI 读取Request的InputStream

最近的项目有一个需求,就是在每个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);        ...}

 

WebAPI 读取Request的InputStream