.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 ();  
}  

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

 

 

 
 

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

更多相關文章
  • 1. 在WPF怎麼在UI上添加超級鏈接 這篇文章的目的是介紹怎麼在WPF里創建自定義的HyperlinkButton控制項。很神奇的,WPF居然連HyperlinkButton都沒有,不過它提供了另一種方式用於在UI上添加超級鏈接: 如果需要在超級鏈接里放圖片或其它東西,代碼如下: 這真是很怪,為什麼 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 1. RSA加密與解密 -- 使用公鑰加密、私鑰解密 測試: RSATool myRSA = new RSATool(); Dictionary<string, string> dictK = new Dictionary<string, string>(); dictK = myRSA.GetKe ...
  • (雙擊全屏播放) 1、安裝vsftpd yum install -y vsftpd 2、編輯ftp配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO #關閉匿名登錄 chroot_local_user=YES #用於指定用戶列表文件中的用戶是否允許 ...
  • 老師在講C#實戰項目時所使用的SqlHelper,使用的資料庫時SQL Server ...
一周排行
  • 首先給大家介紹一下序列化是用來乾什麼的,他為什麼出現 序列化這種技術說到底其實就是把臨時數據保存在電腦上。大家都知道對於程式而言對象是一種稍縱即逝的數據,不僅僅是程式重啟、電腦重啟,就連內部函數的變化也有可能導致對象的消失,但是總有一些對象是大家不想讓其隨意消失的並且想在下一次開啟程式的時候進行載入 ...
  • 一、前言 在.Net Framework框架有專門獲取webconfig配置的方法供我們使用,但是在.Net Core或者.Net Standard中沒有可以直接使用的方法來獲取配置文件信息,下麵就來實現獲取配置信息。 二、獲取配置信息的實現 在.Net Core中,他的配置信息的載體是一個json ...
  • 你一定看過這篇文章 《進擊的 Java ,雲原生時代的蛻變》, 本篇文章的靈感來自於這篇文章。北京時間9.24 就將正式發佈.NET Core 3.0, 所以寫下這篇文章讓大家全面認識.NET Core。.NET 生態系統是一個不斷變化的生態圈,我相信它正在朝著一個偉大的方向發展。正好 最近 Inf... ...
  • 參考文檔:Dapper one to many Table C Code pulic List GetPersons(){ var sql = @"SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'Uni ...
  • 非標設備多相機流水線模式緩存圖片(C/S客戶端,c 開發語言) ​ 本文所說流水線方式下存儲圖像是在軟體測量周期慢於圖片周期前提下講解的,如果軟體一直在等待圖片數據,邏輯就沒有那麼複雜。 1、非標設備項目,常規模式測量流程 常規模式下,相機採集圖像信號由上位機控制(無論軟觸發、硬觸發)。每個周期內的 ...
  • 簡單創建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html 登陸驗證四種方式:https://www.cnblogs.com/zuowj/p/5123943.html 解決跨域的8種方法:https://blog.csd ...
  • 最近有個需求就是網頁表格裡面的數據導出到excel 於是從各位前輩的博客園搜了搜demo 大部分非為兩類 都是用的插件NPOI和Eppluse ,因此在這裡就介紹Eppluse 用法,還有就是在博客的時候 好多有留言說想看從資料庫裡面的數據進行導入 而不是寫死的,所以我就以我的案例給大家分享下用法( ...
  • 表達式樹練習實踐:C 值類型、引用類型、泛型、集合、調用函數 [TOC] 一,定義變數 C 表達式樹中,定義一個變數,使用 。 創建變數結點的方法有兩種, 兩種方式都是生成 類型 和 都具有兩個重載。他們創建一個 ParameterExpression節點,該節點可用於標識表達式樹中的參數或變數。 ...
  • 就像是.NET Framework WebApi與.NET Core WebApi一樣,.NET Framework MVC與.NET Core MVC的區別,也是框架的之間的區別。本系列先首先從.NET Framework MVC介紹,後面再去介紹.NET Core MVC 狹義MVC: MVC是 ...
  • 緩存的實現 我們不是做第三方比如Redis等的緩存實現,而是根據實際情況,基於C#上做一些環境變數的保存,方便項目使用。 1、系統全局變數 很多時候,在系統運行開始,需要對系統的運行參數進行保存,以便供全局使用。 代碼如下: 這裡使用一個靜態變數的Dictionary來進行保存,所有項目均可以直接獲 ...
x