.Net 連接FTP下載文件報錯:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy

来源:https://www.cnblogs.com/Juning/archive/2019/08/22/11392683.html

系統環境: 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 類會嘗試按如下方式找到代理配置腳本:

  1. WinINet InternetQueryOption 函數用於查找 Internet Explorer 最近檢測到的代理配置腳本。

  2. 如果找不到該腳本,WebProxy 類將使用動態主機配置協議 (DHCP) 查找該腳本。 DHCP 伺服器可以採用腳本的位置(主機名)或腳本的完整 URL 進行響應。

  3. 如果 DHCP 未標識 WPAD 主機,則查詢 DNS 以找到 WPAD 作為其名稱或別名的主機。

  4. 如果未標識該主機,並且代理配置腳本的位置由 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 ();  
}  

結合上述解釋,在問題電腦上,將自動檢測代理關閉後,測試正常。

 

 

 
 

您的分享是我們最大的動力!

更多相關文章
  • 導出至Excel是非常常見,我們可以用很多類庫,例如Aspose、NOPI、Interop,在這裡我們使用微軟自家的工具。我的WPF綁定的ObservableCollection<T>集合。 該方法還不止這麼多,還涉及到了1-27 = A-Z 的適配,如以下方法。 最後我們獲取數據給方法,下麵是設計 ...
  • 本文主要參照https://www.bilibili.com/video/av42364337/?p=4 英文幫助文檔:https://identityserver4.readthedocs.io/en/latest/ 中文幫助文檔:http://www.identityserver.com.cn ...
  • 一、Swagger是什麼 Swagger 是一款RESTFUL介面的、基於YAML、JSON語言的文檔線上自動生成、代碼自動生成的工具。 二、如何在項目中加入Swagger Swagger安裝引用 右鍵Web項目依賴項>管理NuGet程式包>在搜索框輸入"Swashbuckle.AspNetCore ...
  • 本次應用DevExpress和C#語言製作了一個批量添加水印的程式,看界面效果圖: 界面中既可以進行文字水印添加,也可以圖片水印添加,同時還可以對水印的位置進行設置,比較實用! 文字水印的具體添加情況,看圖: 還可以文字的預覽: 整個文字水印的預覽: 同時圖片的水印預覽: 最後顯示下圖片的水印效果: ...
  • 摘要 本文將介紹如何通過VS2019創建Xamarin.Forms應用程式,以及如何進行調試。 前言 本文介紹Xamarin.Froms應用程式的創建和調試。 開發環境 1.Visual Studio 2019 2.Xamarin.Forms 3.6.0.344457 創建 1.打開VS2019,選 ...
  • 初學者經常碰到的,即獲取HTML元素集合,迴圈給元素添加事件。在事件響應函數中(event handler)獲取對應的索引。但每次獲取的都是最後一次迴圈的索引。原因是初學者並未理解JavaScript的閉包特性。 1. <!DOCTYPE HTML> 2. <html> 3. <head> 4. < ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 話不多說,上圖: 整體項目結構如圖所示,我的設計初衷是基於.netCore + DI + Vue 打造一個適合初學者的簡捷開發框架。 架構模型採用基於RESTful API風格的前後臺分離框架,總體分為五層:表示層(前端UI)、交互層、業務層、數據訪問層、數據存儲層。 項目中用到的技術如下圖所示: ...
一周排行
  • 該方式是直接對屏幕進行截圖操作UserControl chartContainPanel = new UserControl();Graphics graph = chartContainPanel.CreateGraphics();Size s = chartContainPanel.Size;B... ...
  • dotnetcore3.1 WPF 中使用依賴註入 Intro 在 ASP.NET Core 中預設就已經集成了依賴註入,最近把 "DbTool" 遷移到了 WPF dotnetcore 3.1, 在 WPF 中我們也希望能夠使用依賴註入,下麵來介紹一下如何在 WPF dotnetcore3.1 中 ...
  • 原來的C 程式都有Main的,現在用vs新建一個Wpf項目,啟動似乎變成App.xmal,前期項目中為了獲取啟動參數,很是折騰了一番: 1.先是修改App.xaml,添加StartUp事件 2.然後編輯Application_Startup,判斷e.Args數組 總感覺跟又臭又長的裹腳布一樣,不爽。 ...
  • 冒泡排序原理:(升序)通過當前位置數和後一個位置數進行比較 如果當前數比後一個數大 則交換位置, 完成後 比較基數的位置變成下一個數。直到數組末尾,當程式運行完第一遍 最大的數已經排序到最後一個位置了。次數可以減少迴圈數不用管最後一個數 降序排序同理 不過是把比較方式變成判斷當前數是否小於下一個數 ...
  • 一、前言 這方面的資料很多,重覆的寫沒必要,但是最近一直在學習身份驗證和授權相關東東,為了成體系還是寫一篇,主要是從概念上理解identity系統。 參考:https://www.cnblogs.com/r01cn/p/5179506.html 二、概述 幾乎所有系統都包含用戶、角色、許可權、登錄、註 ...
  • 首先我們使用最簡單的模板案例,裡面有一個Counter計數器,你可以在創建模板中找到。 首先需要設置運行調試方式為IIS Express。這意味著,MAC可能不能使用調試。 然後開啟運行而不調試(Ctrl+F5) 按Shift + Alt + D,會出現一個新的頁面。 如果你想用Chrome調試,復 ...
  • 實體映射時,遇到複雜類型,可選擇下述方法處理: NotMapped,跳過映射 在複雜類型上聲明 [Owned],但僅限該複雜類型是全部由簡單值類型組成的 自定義序列化方法 示例: IPInfo使用了owned,對IPEndPoint使用自定義序列化,對VersionInfo使用JSON序列化 @@@... ...
  • .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect 繼上一篇 ".net core 3 web api jwt 一直 401" 為添加 所述的坑後, 本次為添加 ,又踩坑了。 自從 .NET Core 2.2 之後,CORS跨域配置代碼發 ...
  • 在前一章已經學習過WPF動畫的第一條規則——每個動畫依賴於一個依賴項屬性。然而,還有另一個限制。為了實現屬性的動態化(換句話說,使用基於時間的方式改變屬性的值),需要有支持相應數據類型的動畫類。例如,Button.Width屬性使用雙精度數據類型。為實現屬性的動態化,需要使用DoubleAnimat ...
  • WPF dotnet core 3.1 基於 `Microsoft.Extensions.Localization` 實現基本的多語言支持 ...
x