2017-06-05 59 views
2

我有一些代码使用HttpClient进行Server2Server调用。下面是一些简单的代码HttpClient正在修改我的原始请求以更改域

代码,以请求

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对象也会显示新的错误域。我不知道为什么会发生这种情况。我甚至设置AllowAutoRedirectfalse

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

+0

什么是域,你是否控制DNS入口/服务器等? –

+0

原始域名是我公司用来接收传入流量的服务器(让我们称之为prod.company.com),但是新的域名是(dev.anothercompany.com),其他公司是我们的母公司,只是买了我们。似乎是一些IIS配置可能?我认为域的细节并不重要,仅仅是它正在改变的事实 – sedavidw

+2

'NameValueCollection头部'集合是否恰巧包含'Host'的条目? – spender

回答

1

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

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


顺便说一句,这种行为可能是有用的,如果(比如)你要发现的HttpWebRequest的DNS性能(HttpClient的在Windows业务部)是不合标准的。我使用第三方库绕过了.Net/Windows DNS,查找主机的IP,重写Uri以使用IP地址代替主机名,然后将传出请求上的Host标题重新设置为原始主机名称。