修改WebApi DelegatingHandler中的Request.Content

 啊明的小蝴蝶_522 发布于 2022-12-07 14:47

我需要修改请求的内容来替换一些字符(因为一些unicode问题).以前(在ASP.NET MVC中)我用HttpModules做了这个,但是在WebApi中我似乎应该使用DelegatingHandler,但它完全不同.

现在我想知道如何request.Content在SendAsync方法中进行修改.我需要这样的东西:

  protected async override Task 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;
}

在上面的代码中,我想我应该检查请求的内容类型,然后决定做什么.如果是,我应该做哪些检查?

1 个回答
  • 我在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);
        }
    

    2022-12-11 02:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有