我需要修改请求的内容来替换一些字符(因为一些unicode问题).以前(在ASP.NET MVC中)我用HttpModules做了这个,但是在WebApi中我似乎应该使用DelegatingHandler,但它完全不同.
现在我想知道如何request.Content
在SendAsync方法中进行修改.我需要这样的东西:
protected async override TaskSendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { var s = await request.Content.ReadAsStringAsync(); // do some modification on "s" s= s.replace("x","y"); request.Content = new StringContent(s); var response = await base.SendAsync(request, cancellationToken); return response; }
在上面的代码中,我想我应该检查请求的内容类型,然后决定做什么.如果是,我应该做哪些检查?
我在SendAsync
方法中做了类似下面的事情.虽然它不是一个全面的解决方案,但它的确有效!:
//first : correct the URI (querysting data) first request.RequestUri = new Uri(Correcr(request.RequestUri.ToString())); var contentType = request.Content.Headers.ContentType; if (contentType != null) { if (contentType.MediaType == "application/x-www-form-urlencoded")//post,put,... & other non-json requests { var formData = await request.Content.ReadAsFormDataAsync(); request.Content = new FormUrlEncodedContent(Correct(formData)); } else if (contentType.MediaType == "multipart/form-data")//file upload , so ignre it { var formData = await request.Content.ReadAsFormDataAsync(); request.Content = new FormUrlEncodedContent(Correct(formData)); } else if (contentType.MediaType == "application/json")//json request { var oldHeaders = request.Content.Headers; var formData = await request.Content.ReadAsStringAsync(); request.Content = new StringContent(Correct(formData)); ReplaceHeaders(request.Content.Headers, oldHeaders); } else throw new Exception("Implement It!"); } return await base.SendAsync(request, cancellationToken);
和这个辅助函数:
private void ReplaceHeaders(HttpContentHeaders currentHeaders, HttpContentHeaders oldHeaders) { currentHeaders.Clear(); foreach (var item in oldHeaders) currentHeaders.Add(item.Key, item.Value); }