从ASP.net 4 Web API 2项目通过HttpClient调用REST服务导致异常

时间:2016-04-15 10:03:00

标签: c# asp.net asp.net-web-api

现状:我使用WebAPI 2模板创建了一个ASP.net项目(Web项目)。其中一个HTTPGET方法现在尝试使用以下代码向另一个REST API发出请求。

[HttpGet]
public string Get()
{
    var uri = @"http://api.../...";

    var httpClient = new HttpClient();
    var response = httpClient.GetAsync(uri).GetAwaiter().GetResult(); // <- exception here

    response.EnsureSuccessStatusCode();

    string content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

    return content;
}

在标有注释的行中,以下HttpRequestException带有消息&#34;无法连接到远程服务器&#34; (内部异常)被抛出。

System.Net.Http.HttpRequestException was unhandled by user code
  HResult=-2146233088
  Message=An error occurred while sending the request.
  Source=mscorlib
  ...
  InnerException: 
       HResult=-2146233079
       Message=Unable to connect to the remote server
       Source=System
       StackTrace:
            at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
            at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
       InnerException: 
            ErrorCode=10060
            HResult=-2147467259
            Message=A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond ...
            NativeErrorCode=10060
            Source=System
            StackTrace:
                 at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
                 at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
            InnerException: 

到目前为止我尝试了什么:

  1. 我在浏览器中使用完全相同的URI(通过复制和粘贴),并返回带有一些数据的JSON。
  2. 在创建WebAPI2项目之前,我使用ASP.net 5的RC候选人。我创建了一个基于ASP.net 5模板&#34; Web API&#34;的项目。在那里,我有完全相同的代码,它工作正常。
  3. 假设:我的假设是ASP.net 4 Web API 2模板中的配置有一些阻止获得响应的配置。我在SO上发现了一些类似的question,似乎某些私人网络被禁用了。

    问题:在基于ASP.net 4 Web API 2的项目中使用HttpClient时,阻止响应的原因是什么?

2 个答案:

答案 0 :(得分:0)

我能够找出根本原因是什么。简短的回答是ASP.net 5模板使用了代理,可能是通过Windows组策略配置的代理,而ASP.net 4模板直接连接到其他REST服务。但是因为某些防火墙禁止它,所以它不起作用。

长答案:为了检查两个模板(ASP.net 4和5)的网络流量,我使用了sysinternals工具中的Process Monitor。我为IISExpress.exe和dnx.exe设置了一个过滤器。

对于ASP.net 4模板,如下所示。

enter image description here

只有两个条目可以看到IISExpress直接连接到REST服务。在ASP.net 5的情况下,有更多的条目,因为它使用代理而不是直接连接。我实际上认为这是一个代理,因为它的主机名。这里需要注意的一点是,dnx.exe正在建立连接,而不是IISExpress.exe。

enter image description here

为了让IISExpress使用ASP.net 4模板的代理,我将以下几行添加到项目web.config中。我使用了进程监视器中显示的主机名和端口。

<system.net>
  <defaultProxy>
    <proxy usesystemdefault="True"
           proxyaddress="http://proxy.<hostname>:<port>"
           bypassonlocal="True"/>
  </defaultProxy>
</system.net>

所以我的假设是在Windows中的某个地方配置了这个代理,可能是通过组策略(?)。 Firefox,dnx.exe和其他人正在使用此配置。但IISExpress忽略了这一点,因此没有收到REST API的答案。

答案 1 :(得分:0)

正在发生的事情可能是他没有允许公众使用,可能会允许一些特定的域名。就像我看来的那样。

您可以阅读本文以便更好地理解: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api