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 传出请求返回原始主机名。
我有一些代码使用 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 传出请求返回原始主机名。