2016-03-29 51 views
11

我知道有很多問題/答案,關於這個的博客,而不是談論Telerik的常見問題解答。不過我找不到這個診斷並清晰純淨的方式解決:如何與HttpClient一起使用Fiddler?

語境:

我有一個Web API應用程序,我有一個(單元測試)客戶端,它使用的HttpClient發送請求到API。 Web API應用程序在http://localhost:8631/收聽 有時我使用Fiddler來查看正在發生的事情。

問題:

我的HttpClient和Web API之間的流量不會被捕獲提琴手。發射後提琴手流量仍然可以,但未在Fiddler中顯示。

診斷至今:

  • 重要提示:使用任何瀏覽器發送請求到http://localhost:8631/工作,我的意思是:交通由小提琴手
  • 捕獲配置HttpClient的明確使用提琴手作爲代理並沒有幫助。
  • 更改HttpClient的網址從http://localhost:8631/http://localhost.fiddler:8631/幫助,無論代理的已配置或沒有。

結論: 至少我的情況:這是不是HttpClient的明確配置爲使用招作爲代理與否。這是關於HttpClient和/或Fiddler的本地主機行爲。再次

問題:

有人可能會問:問題解決了,那麼什麼是問題?嗯......

Q1:這仍然是一個棘手問題,因爲URL編碼或配置的地方(我的意思是http://localhost:8631/http://localhost.fiddler:8631所以每次開始和提琴手停止它必須更多信息:檢查源代碼到源代碼管理,以及由隊友檢查另一臺機器可能會導致問題。因此:是否有任何較少的痛苦解決方法?

硬編碼我的機器名稱可以工作)在團隊工作和使用源代碼控制時導致非常相同的痛苦和問題

Q2:爲什麼這種不一致的行爲:Pure http://localhost:8631/適用於任何瀏覽器,但不適用於HttpClient。

我想回答Q2可以讓我們更接近一個更實用的解決方法。

代碼圖表

// Using the following url w o r k s regardless of any proxy setting 
    // ...but it is a pain to hardcode or configure this and change depending on Fiddler is running or not 

    //private const string ApiUrl = "http://localhost.fiddler:8631/"; 

    // This is not working regardless any proxy setting. Trafic bypasses Fiddler 
    private const string ApiUrl = "http://localhost:8631/"; 

    protected HttpClient GetClient() 
    { 
     var httpClientHandler = new HttpClientHandler 
     { 
      // Does not work 
      //Proxy = new WebProxy("http://localhost:8888", false), 

      // Does not work 
      Proxy = WebRequest.DefaultWebProxy, 
      UseProxy = true 
     }; 


     var client = new HttpClient(httpClientHandler) 
     { 
      BaseAddress = new Uri(ApiUrl) 
     }; 
     // ... 
+0

你*不需要做任何事情與HttpClient一起使用Fiddler。 Fiddler設置/重置默認OS代理,以便*不需要修改任何應用程序以使用它。只有當您...在代理設置之前撥動代理設置或終止Fiddler纔有機會重置OS代理,例如關閉 –

+0

爲了獲得特定問題的幫助,您需要發佈實際代碼,包括對app.config中system.net代理設置的任何修改 –

+0

您是否嘗試過.NET的提琴手文檔? http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureDotNETApp –

回答

7

問題是WebProxy類的Microsoft實現對環回URL(基於諸如「localhost」之類的名稱列表)的靜態檢查,並且將繞過任何標識爲環回的uris代理。即使BypassProxyOnLocal設置也無關緊要。如果您在本地網絡中使用本地計算機名稱或其他計算機名稱,此設置纔有效。主機本地主機或IP地址127.0.0.1總是被識別爲回送,並將導致繞過代理。

.NET框架代碼的相關部分在WebProxy.IsBypassedManual

if (host.IsLoopback) { 
    return true; // bypass localhost from using a proxy. 
} 

寫自己WebProxy類的後代,並覆蓋GetProxyIsBypassed方法使用代理甚至回送的URL返回一個URI 。然後將該類的實例分配給您用來創建HttpClientHttpClientHandler

似乎無法正常工作,因爲.net代碼希望與實現IAutoWebProxy的對象一起工作,但IAutoWebProxy是內部聲明的,不能在我們自己的代碼中使用。

我看到的最簡單的解決方案是在運行時使用ApiUrl中的本地計算機名替換「localhost」。無論Fiddler是否正在運行,本地計算機名稱都將起作用。

+2

這是正確的答案。另請參閱https://visualstudio.uservoice。com/forums/121579-visual-studio-2015/suggestions/6359204-support-the-loopback-token-in-proxy-bypass-lists – EricLaw

+0

我使用machinename - 而fiddler仍然忽略我的httpclient調用本地和基於web的web服務?! – niico

+0

@niico用你的代碼的細節開始一個新的問題。也許你有阻止客戶使用任何代理的代碼,或者你自己設置了特定的代理? – NineBerry

-1

只要定義默認代理到您的HttpClient的實例,它就像一個魅力。您不必更改代碼中的任何網址。

​​

我們使用相同的行爲沒有任何問題(Windows 10,Fiddler4)。

+0

謝謝,試過。不幸的是,這並沒有幫助。請注意,在我所寫的診斷部分中,即使明確地將代理設置爲Fiddler也沒有幫助。但是使用* localhost.fiddler *而不是localhost有幫助。從瀏覽器使用它時,奇怪的事情*工程*沒有.fiddler doman。 –

+0

@ g.pickardou是您的代理SOCK或HTTP代理?通常Fiddler應該創建一個HTTP代理。我們使用HTTP代理服務器,並且在所有機器上都可以100%工作。同樣在使用Enterprise Proxies的客戶。 – Ben

+0

我根本沒有代理。 Fiddler在運行時是代理。 –

相關問題