.NET 抛出 WebException 而不是设置 StatusCode

Posted

技术标签:

【中文标题】.NET 抛出 WebException 而不是设置 StatusCode【英文标题】:.NET throws WebException instead of setting StatusCode 【发布时间】:2013-11-20 22:38:11 【问题描述】:

我的方法中有以下代码:

// make the FTP request
var request = (FtpWebRequest)WebRequest.Create(serverUri);
request.KeepAlive = true;
request.Method = WebRequestMethods.Ftp.MakeDirectory;
return (FtpWebResponse)request.GetResponse();

serverUri 是有效的,如果该目录在服务器上不存在,则此方法有效。但是,如果该目录已存在,则会出现 System.Net.WebException : The remote server returned an error: (550) File unavailable (e.g., file not found, no access)

为什么当我调用request.GetResponse() 而不是将FtpWebResponse 对象的StatusCode 设置为FtpStatusCode.ActionNotTakenFileUnavailable 即550 时会出现此异常?

我找到了有关如何处理异常并从中获取状态代码和描述的信息。但是我想知道为什么首先抛出异常,而不是设置响应对象的状态代码并让编码器决定它是否需要异常。

【问题讨论】:

【参考方案1】:

因为在发出 Http 请求后得到的错误代码与语言的 Exception 语义完全匹配。您实际上没有有意义的响应来返回,因为这是一个“异常”情况,所以将 Web 错误转换为 WebException 是有意义的。

【讨论】:

【参考方案2】:

这实际上是按设计运行的。您需要捕获该特定异常,然后询问响应。根据MSDN documentation:

如果引发 WebException,请使用异常的 Response 和 Status 属性来确定来自服务器的响应。

因此,代码可能如下所示:

try

    return (FtpWebResponse)request.GetResponse();

catch (WebException we)

    // interrogate the WebException for the response data you're looking for 

【讨论】:

以上是关于.NET 抛出 WebException 而不是设置 StatusCode的主要内容,如果未能解决你的问题,请参考以下文章

使用 HtmlAgilityPack 进行 Web 查询抛出 System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道 [重复]

读取 WebException 的响应流时出现 WebException

System.Net.WebException:操作已超时

HttpWebRequest .GetResponse 抛出 WebException '操作已超时'

为啥 FtpWebRequest 恰好在长传输结束时抛出 WebException?

FireBase 在第一轮循环后抛出 WebException 400