【问题标题】:HttpClient changing request URI when called from WebAPI从 WebAPI 调用时,HttpClient 更改请求 URI
【发布时间】:2018-09-25 06:11:10
【问题描述】:

我正在为想要与另一台服务器上的 API 通信的 ASP.NET MVC 应用程序实现一个透明的服务器端代理;代码相当简单:

public class TransparentProxyDelegatingHandler : DelegatingHandler
{
    private static readonly Uri ApiUri;
    private static readonly HttpClient Client;

    static TransparentProxyDelegatingHandler()
    {
        var apiServer = new Uri(ConfigurationManager.AppSettings["ApiUrl"]);
        ApiUri = new Uri(apiServer);
        Client = new HttpClient();
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("X-Forwarded-For", request.GetClientIpAddress());
        request.RequestUri = TranslateIncomingRequestToUpstreamApi(request);
        request.Headers.AcceptEncoding.Clear();

        var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
        return response;
    }

    private static Uri TranslateIncomingRequestToUpstreamApi(HttpRequestMessage request)
    {
        var forwardUri = new UriBuilder(request.RequestUri)
        {
            Host = ApiUri.Host,
            Path = request.RequestUri.AbsolutePath.Replace("/Proxy", string.Empty)
        };
        return forwardUri.Uri;
    }
}

所以如果我查询GET https://ui.myserver.com/proxy/timesheets?from=2018-01-01,请求URI 会被代理更改为GET https://api.myserver.com/timesheets?from=2018-01-01,我可以在调试器中验证这一点;但是,当调用SendAsync方法时,请求URI的主机名部分改回https://ui.myserver.com,调用失败。

为什么当我调用 SendAsync 时它会改变 request.RequestUri 的值?我已经检查了 GitHub (https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/HttpClient.cs) 中的源代码,但更改值的条件似乎都不适用于我的情况。不幸的是,GitHub 源代码与调试符号不一致,所以我似乎无法进入 HttpClient 源代码来弄清楚到底发生了什么。

【问题讨论】:

    标签: c# asp.net-web-api dotnet-httpclient


    【解决方案1】:

    好的,我找到了问题的原因;我需要设置更改主机标头;对代理的初始请求将其设置为 UI 的主机名 (ui.myserver.com),并覆盖在请求中设置的代理的主机名。因此,如果我添加以下内容:

    request.Headers.Host = $"{ApiUri.Host}:{ApiUri.Port}";
    

    然后一切都会神奇地工作。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2018-08-02
      • 2023-01-09
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多