.Net 连接FTP下载文件报错:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy

0
5

系统环境:
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. WinINetInternetQueryOption函数用于查找 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 ();  
}  

结合上述解释,在问题电脑上,将自动检测代理关闭后,测试正常。

<

发布回复

请输入评论!
请输入你的名字