Out of the box, WebApi pipeline bind request body to parameter, therefore WebApi Controller (which inherit from ApiController) `Request.Content` object is empty.
For example, passing this json in the request body:
[ { "Name": "Test", "Status": "C", } ]
Will bind it to WebApi Controller’s parameter, however, `Request.Content` object is empty.
Overcome this issue by creating `DelegatingHandler` to add request body back.
RequestHandler.cs
using System.Net.Http; using System.Threading; using System.Threading.Tasks; namespace QC { public class RequestHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // Request body stream is emptied when WebApi bind request body to parameter, here we add original request body back so we can access it if (request.Content != null) { string body = await request.Content.ReadAsStringAsync(); request.Properties["body"] = body; } return await base.SendAsync(request, cancellationToken); } } }
Register in WebApiConfig.
WebApiConfig.cs
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new RequestHandler()); } }
Viola! `Request.Content` contains request body.
Code is from here.