![](/img/trans.png)
[英]HTTPClient error when calling ASP.NET Web API REST service from ASP.NET MVC app
[英]Calling REST service via HttpClient from ASP.net 4 Web API 2 project results in exception
當前情況:我已經使用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
。
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上發現了類似的問題 ,似乎某些專用網絡已被禁用。
問題:在基於ASP.net 4 Web API 2的項目中使用HttpClient時,如何阻止收到響應?
我能夠找出根本原因是什么。 簡短的答案是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的答復。
可能是由於他不允許公眾使用,可能允許了某些特定的域。 就像在我看來。
您可以閱讀本文以獲得更好的理解: http : //www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.