2013-07-24 25 views
1

我有一個基於這個例子中一個簡單的Web API項目: http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/RelaySample/Program.cs如何使HttpClient中繼流量在Fidder或Charles中顯示?

然而,繼電器正在與本地服務器上面的示例中,我的項目中繼電器正在與外部Web服務器與真實地址; companyX.com

我通過瀏覽器使用的中繼服務(或者,web代理服務),例如,在瀏覽器請求relayService.com/companyX。中繼服務響應來自外部companyX.com站點的數據。

繼電器的偉大工程,但有些標題是不正確的,我需要看什麼HttpClient的被髮送到遠程服務器companyX.com。

在小提琴手或查爾斯,只請求/從我的瀏覽器relayService.com響應被列出,從HttpClient的到relayService.com請求/響應從未顯示出來。

的relayService.com是我的機器上本地運行在IIS7,我使用的hosts文件,直接流量relayService.com。

創建HttpClient的時候我曾嘗試以下幾個變化:

 var clientHandler = new HttpClientHandler 
     { 
      CookieContainer = cookies, 
      UseCookies = true, 
      UseDefaultCredentials = false, 
      Proxy = new WebProxy("http://localhost:8888"), 
      UseProxy = true, 
      AutomaticDecompression = DecompressionMethods.GZip, 
      AllowAutoRedirect = false, 
      ClientCertificateOptions = ClientCertificateOption.Automatic 
     }; 


     HttpClient client = new HttpClient(clientHandler); 

UPDATE

如果我改變UseProxy = false服務繼續工作,當小提琴手是打開還是關閉。

隨着UseProxy = true那麼該服務會失敗,如果提琴手是開放的,我得到以下錯誤:

Object reference not set to an instance of an object. 

at System.DomainNameHelper.IdnEquivalent(String hostname) at System.Net.HttpWebRequest.GetSafeHostAndPort(Uri sourceUri, Boolean addDefaultPort, Boolean forcePunycode) at System.Net.HttpWebRequest.GenerateProxyRequestLine(Int32 headersSize) at System.Net.HttpWebRequest.SerializeHeaders() at System.Net.HttpWebRequest.EndSubmitRequest() at System.Net.Connection.CompleteConnection(Boolean async, HttpWebRequest request) 

隨着UseProxy = true和提琴手是封閉的,我得到以下(明顯)錯誤:

No connection could be made because the target machine actively refused it 127.0.0.1:8888 

在同一個解決方案,我使用的HttpWebRequest從網絡上下載數據和不顯示在提琴手,所以它似乎是與HttpClient.GetAsync()的一個問題

我已經在兩臺機器上嘗試了這一結果。

我一直在這個整天掙扎,任何幫助,將不勝感激。

只是爲了回顧: * relayService.com是我的機器上本地運行在IIS7

  • hosts文件 「127.0.0.1 relayService.com」

  • relayService.com是MVC Web API網站使用HttpClient.GetAsync()從實時網絡下載內容

  • 提琴手/ Charles在同一臺機器上本地運行

  • 瀏覽器流量到本地relayService.com出現在Fiddler/Charles

  • HttpClient。獲取網頁流量的GetAsync()不會出現在提琴手/查爾斯

  • 提琴手/查爾斯都是最新版本。

再次感謝

回答

0

你什麼都不需要在你的HOSTS文件,如果您使用招;您可以使用Fiddler的工具> HOSTS將流量重定向到您想要的任何位置。

嘗試從服務帳戶(例如ASP.NET帳戶)中捕獲流量時,通常需要配置該帳戶以使用代理;有關詳情,請參閱http://fiddler2.com/blog/blog/2013/01/08/capturing-traffic-from-.net-services-with-fiddler。如果你這樣做,你應該不需要直接在代碼中配置代理對象。

您顯示的異常表明這是GenerateProxyRequestLine函數中的一個錯誤。如果您更新:new WebProxy("http://localhost:8888");new WebProxy("127.0.0.1", 8888);,是否有任何更改?

一般來說,.NET應用程序將繞過指向// localhost或//127.0.0.1的URL的代理,因此在使用Fiddler進行調試時,通常使用//localhost.fiddler的服務URL,以便流量總是被髮送到代理。

+0

Eric,你好,感謝您的答覆。我已經嘗試過這些建議。但是,我確實修復了它!我沒有解釋爲什麼解決方案可行,但它確實有效。如果您能洞悉任何見解,我將不勝感激。謝謝。 – MCM

0

我通過使HttpClient爲靜態解決了問題。

也能正常工作(該程序的功能),但具有與上述小提琴手的問題,在嘗試使用代理拋出一個錯誤:

using (HttpResponseMessage serviceResponse = await _client().GetAsync(getURL(), HttpCompletionOption.ResponseHeadersRead)) 
    { 
       // Return response 

    } 

private HttpClient _client() 
{ 

    var clientHandler = new HttpClientHandler 
    { 
     UseCookies = true, 
     UseDefaultCredentials = false, 
     Proxy = new WebProxy("http://localhost:8888"), 
     UseProxy = true, 
     AutomaticDecompression = DecompressionMethods.GZip, 
     AllowAutoRedirect = true, 
     ClientCertificateOptions = ClientCertificateOption.Automatic 
    }; 

    HttpClient client = new HttpClient(clientHandler); 
    client.Timeout = TimeSpan.FromMinutes(20); 

    return client; 
} 

客戶端與創建

但是,下面也適用,所有流量都在小提琴手中出現!

private static readonly HttpClientHandler _clientHandler = new HttpClientHandler() 
{ 
    //CookieContainer = cookies, 
    UseCookies = true, 
    UseDefaultCredentials = false, 
    Proxy = new WebProxy("http://localhost:8888"), 
    UseProxy = false, 
    AutomaticDecompression = DecompressionMethods.GZip, 
    AllowAutoRedirect = false, 
    ClientCertificateOptions = ClientCertificateOption.Automatic, 
}; 

//Create a shared instance of HttpClient and set the request timeout 
private static readonly HttpClient _client = new HttpClient(_clientHandler) 
{ 
    Timeout = TimeSpan.FromMinutes(20) 
}; 

客戶端與(唯一的區別是_client後去除 '()' 以上)創建:

using (HttpResponseMessage serviceResponse = await _client.GetAsync(getURL(), HttpCompletionOption.ResponseHeadersRead)) 
    { 
       // Return response 

    } 

我不知道爲什麼這個工程。任何洞察力將不勝感激。

感謝,

+0

使對象靜態「修復」事物的事實意味着HttpClient對象在返回響應之前被垃圾回收。至於這是爲什麼,恐怕我對使用異步方法時創建的狀態機不夠了解。 – EricLaw

+0

使用async/await函數生成的狀態機與閉包和迭代器的工作方式非常相似,因爲await調用下面引用的任何東西仍然保持其引用並阻止垃圾回收,但是如果再也不使用客戶端對象,它可能會解釋它。也就是說,HttpClient和HttpClientHandler都是IDisposable,因此您應該在「using」語句中包裝創建/使用,這會強制在狀態機中存在await的引用(用於在生成的「finally」塊中處理)。 – TheXenocide

相關問題