系統環境: Windows + .Net Framework 4.0 問題描述: C#連接FTP下載文件時,在部分電腦上有異常報錯,在一部分電腦上是正常的;異常報錯的信息:System.InvalidOperationException: The requested FTP command is n ...
系統環境: Windows + .Net Framework 4.0 問題描述: C#連接FTP下載文件時,在部分電腦上有異常報錯,在一部分電腦上是正常的;異常報錯的信息:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy 分析過程: 在網上搜索到的解決方案,基本都是將代理置為null:request.Proxy = null; 並沒有解釋其原因。 調試發現,如果不去主動設置Proxy,創建request對象後(request = (FtpWebRequest)WebRequest.Create(uri)),其預設的Proxy就是null,不解。。。 如下是查找相關資料,得到的解釋:
.NET Framework 上
Proxy屬性標識IWebProxy與 FTP 伺服器進行通信的實例。 代理的設置是由系統使用的配置文件和 Internet Explorer 本地網路設置。 若要指定應使用任何代理,請設置Proxy返回的代理實例到GlobalProxySelection.GetEmptyWebProxy方法。
必須設置Proxy之前將數據寫入到請求的流或獲取響應。 更改Proxy後調用GetRequestStream, BeginGetRequestStream, GetResponse,或BeginGetResponse方法使InvalidOperationException異常。
FtpWebRequest類支持 HTTP 和 ISA 防火牆客戶端代理。
如果指定的代理是 HTTP 代理,則僅DownloadFile, ListDirectory,和ListDirectoryDetails支持命令。
上述說明,基本已經解釋了異常的原因。但是既然代碼中並未指定代理,但是實際缺使用了HTTP代理,結合有的電腦沒問題有的電腦有問題現象,猜測應該是電腦設置或網路設置問題。如下是“自動檢測代理”的說明,基本可以解釋:
自動代理檢測是一個進程,系統使用該進程來標識 Web 代理伺服器,並用於代表客戶端發送請求。 此功能也稱為 Web 代理自動發現 (WPAD)。 啟用自動代理檢測後,系統會嘗試查找代理配置腳本,該腳本負責返回一組可用於請求的代理。 如果找到了代理配置腳本,則會在針對使用 WebProxy 實例的請求獲取代理信息、請求流或響應時,在本地電腦上下載、編譯並運行該腳本。
自動代理檢測由 WebProxy 類執行,且可採用請求級設置、配置文件中的設置和通過 Internet Explorer“區域網(LAN)”對話框指定的設置。
啟用自動代理檢測後,WebProxy 類會嘗試按如下方式找到代理配置腳本:
-
WinINet
InternetQueryOption
函數用於查找 Internet Explorer 最近檢測到的代理配置腳本。 -
如果找不到該腳本,WebProxy 類將使用動態主機配置協議 (DHCP) 查找該腳本。 DHCP 伺服器可以採用腳本的位置(主機名)或腳本的完整 URL 進行響應。
-
如果 DHCP 未標識 WPAD 主機,則查詢 DNS 以找到 WPAD 作為其名稱或別名的主機。
-
如果未標識該主機,並且代理配置腳本的位置由 Internet Explorer LAN 設置或配置文件指定,則使用此位置。
預設情況下,Internet Explorer 代理設置用於檢測此代理。 如果應用程式基於非互動式帳戶運行(沒有用於配置 IE 代理設置的簡便方法),或要使用不同於 IE 設置的代理設置,則可以通過創建定義了 <defaultProxy> 元素(網路設置)和 <proxy> 元素(網路設置)元素的配置文件,對代理進行配置。
對於所創建的請求,可通過將空 Proxy 用於該請求,禁用請求級別的自動代理檢測,如下麵的代碼示例所示。
public static void DisableForMyRequest (Uri resource)
{
WebRequest request = WebRequest.Create (resource);
request.Proxy = null;
WebResponse response = request.GetResponse ();
}
結合上述解釋,在問題電腦上,將自動檢測代理關閉後,測試正常。