我正在为.NET应用程序编写一个更新系统,目前我被困住了.我尝试在远程服务器上获取文件及其内容.为此,如果操作失败,我想使用HttpWebRequest获取内容和状态代码.
我构建了一个包含switch-query的函数,每个部分都会询问状态代码并执行操作.
这看起来如下:
public void AskStatusCode(int code)
{
switch (code)
{
case 404:
// Do an action
break;
case 405:
// Do an action
break;
}
}
Run Code Online (Sandbox Code Playgroud)
好的,就是这样.现在我创建了一个HttpWebRequest和一个HttpWebResponse.
HttpWebRequest requestChangelog = (HttpWebRequest)HttpWebRequest.Create(url);
requestChangelog.Method = "GET";
HttpWebResponse changelogResponse = (HttpWebResponse)requestChangelog.GetResponse();
// Now call the function and set the status code of the response as parameter.
AskStatusCode((int)changelogResponse.StatusCode);
Run Code Online (Sandbox Code Playgroud)
因此,理论应该有效,但事实并非如此.它不会对我在特殊状态代码的"case"-block中添加任何操作.
我从远程服务器上删除了该文件,以测试它是否会执行代码"404"的case-block ,但它总是显示异常(远程服务器回答404),但不是我希望这个状态代码要处理的.
所以,我的问题是,为什么这不起作用?类型是整数,我也将状态代码转换为Int32,你可以看到......
您的信息:检查状态代码后,如果没问题,我想用流阅读器和ResponseStream阅读内容.
帮助将不胜感激.对不起,如果你不明白,我试着说尽可能清楚.
小智 23
您必须检查响应是否因服务器错误(WebException提供WebResponse)而失败.也许这会对你有所帮助:
HttpWebResponse response = null;
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/thisisadeadlink");
request.Method = "GET";
response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
Console.Write(sr.ReadToEnd());
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
response = (HttpWebResponse)e.Response;
Console.Write("Errorcode: {0}", (int)response.StatusCode);
}
else
{
Console.Write("Error: {0}", e.Status);
}
}
finally
{
if (response != null)
{
response.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
4xx和5xx范围内的StatusCodes抛出a WebException
,这就是代码永远不会到达switch语句的原因.
您需要在代码中处理此异常:
HttpWebRequest requestChangelog = null;
HttpWebResponse changelogResponse = null;
try
{
requestChangelog = (HttpWebRequest)HttpWebRequest.Create(url);
requestChangelog.Method = "GET";
changelogResponse = (HttpWebResponse)requestChangelog.GetResponse();
}
catch (WebException we)
{
//handle the error
}
AskStatusCode((int)changelogResponse.StatusCode);
Run Code Online (Sandbox Code Playgroud)
如果您只对检查错误状态代码感兴趣,那么您将AskStatusCode()
在catch块内移动调用.