HttpClient正在修改原始请求以更改域

时间:2017-06-05 15:09:13

标签: c# .net dotnet-httpclient

我有一些使用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对象是使用正确的域正确创建的。我还验证了网络流量进入了错误的域,即使request对象显示新的坏域。我不知道这是为什么会发生这种情况。我甚至将AllowAutoRedirect设置为false

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

1 个答案:

答案 0 :(得分:2)

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

您盲目地注入请求标头的NameValueCollection headers很可能包含Host的条目,该条目与您在Uri中提供的条目不同。

顺便说一下,如果(例如)您发现HttpWebRequest(Windows上HttpClient的业务端)的DNS性能不合标准,则此行为可能很有用。我绕过.Net / Windows DNS,使用第三方库查找主机的IP,重写Uri以使用IP地址代替主机名,然后设置Host标头传出请求返回原始主机名。