我有一些使用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服务器上,我不想为每个服务器创建一个新客户端请求
答案 0 :(得分:2)
因此,对于SendAsync
,请求的Host
标头的值由uri
参数确定...但是可以覆盖Host
标头通过请求的Headers
属性。
您盲目地注入请求标头的NameValueCollection headers
很可能包含Host
的条目,该条目与您在Uri
中提供的条目不同。
顺便说一下,如果(例如)您发现HttpWebRequest
(Windows上HttpClient的业务端)的DNS性能不合标准,则此行为可能很有用。我绕过.Net / Windows DNS,使用第三方库查找主机的IP,重写Uri以使用IP地址代替主机名,然后设置Host
标头传出请求返回原始主机名。