现状:我使用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:
到目前为止我尝试了什么:
假设:我的假设是ASP.net 4 Web API 2模板中的配置有一些阻止获得响应的配置。我在SO上发现了一些类似的question,似乎某些私人网络被禁用了。
问题:在基于ASP.net 4 Web API 2的项目中使用HttpClient时,阻止响应的原因是什么?
答案 0 :(得分:0)
我能够找出根本原因是什么。简短的回答是ASP.net 5模板使用了代理,可能是通过Windows组策略配置的代理,而ASP.net 4模板直接连接到其他REST服务。但是因为某些防火墙禁止它,所以它不起作用。
长答案:为了检查两个模板(ASP.net 4和5)的网络流量,我使用了sysinternals工具中的Process Monitor。我为IISExpress.exe和dnx.exe设置了一个过滤器。
对于ASP.net 4模板,如下所示。
只有两个条目可以看到IISExpress直接连接到REST服务。在ASP.net 5的情况下,有更多的条目,因为它使用代理而不是直接连接。我实际上认为这是一个代理,因为它的主机名。这里需要注意的一点是,dnx.exe正在建立连接,而不是IISExpress.exe。
为了让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