簡體   English   中英

從ASP.net 4 Web API 2項目通過HttpClient調用REST服務導致異常

[英]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: 

到目前為止我嘗試過的是:

  1. 我在瀏覽器中使用了完全相同的URI(通過復制和粘貼),並返回了包含一些數據的JSON。
  2. 在創建WebAPI2項目之前,我嘗試過使用ASP.net 5的RC候選對象。我基於ASP.net 5模板“ Web API”創建了一個項目。 那里我有完全相同的代碼,並且工作正常。

假設:我的假設是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM