在 WebApi DelegatingHandler 中修改 Request.Content



>我需要修改请求的内容来替换一些字符(因为一些 unicode 问题)。以前(在 ASP.NET MVC中),我用HttpModules做了这件事;但在 WebAPI 中,似乎我应该委派处理程序,但它完全不同。

如何在发送异步方法中修改request.Content?我需要这样的东西:

protected async override Task<HttpResponseMessage> SendAsync(
        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);
}

最新更新