HttpClient 正在修改我更改域的原始请求

HttpClient is modifying my original request to change domains

我有一些代码使用 HttpClient 进行 Server2Server 调用。这是一些快速代码

发出请求的代码

    private HttpRequestMessage GetRequest(Uri uri, NameValueCollection headers)
    {
        var method = HttpMethod.Get;
        var request = new HttpRequestMessage(method, uri);
        foreach (string v in headers)
        {
            var success = request.Headers.TryAddWithoutValidation(v, headers[v]);

            if (!success)
            {
                // log something ( no logs are appearing )
            }
        }
        return request;
    }

发出请求的代码

private void AsyncCallUrl(Uri url, NameValueCollection headers)
{
    object result1 = null;
    var handler = new HttpClientHandler() { AllowAutoRedirect = false };
    using (HttpClient client = new HttpClient(handler))
    {
        var request = GetRequest(url, headers);
        using (HttpResponseMessage response = client.SendAsync(request).Result) // when this line is executed the request object's domain is changed to something else
        {
            using (HttpContent content = response.Content)
            {
                result1 = content.ReadAsStringAsync().Result;
            }
        }
    }

我已经验证 request object 是使用正确的域正确创建的。我还验证了网络流量流向了错误的域,甚至 request object 也显示了新的错误域。我不知道的是为什么会这样。我什至将 AllowAutoRedirect 设置为 false

注意: 请注意,如果我使用 GetAsync 而不是 SendAsync,则不会发生域更改。然而,这不是一个理想的解决方案,因为为了添加 headers 我需要将它们添加到 HttpClient 本身并且此代码位于 IIS 服务器上,我不想创建新客户端对于每个请求

因此,对于 SendAsync,请求的 Host header 的值由 uri 参数确定...但是可以覆盖Host header 通过 Headers 属性 的请求。

您盲目注入请求的 header 的 NameValueCollection headers 很可能包含 Host 的条目,这与您在 [=] 中提供的条目不同17=].


顺便说一句,如果(例如)您发现 HttpWebRequest 的 DNS 性能(HttpClient 在 Windows) 是 sub-standard。我绕过了 .Net/Windows DNS,方法是使用第三方库查找主机的 IP,重写 Uri 以使用 IP 地址代替主机名,然后设置 Host header 传出请求返回原始主机名。