我有一个简单的任务:从服务器读取数据,如果服务器无法访问(服务器关闭或网络不良),则从本地磁盘缓存加载数据(可能是陈旧的)。
这是Java代码的简单伪表示:
try {
//read from server
} catch (IOException ioe) {
//most likely a socket timeout exception
//read from local disk
} finally {
//free I/O resources
}
但是在C#中实现它似乎不起作用,因为WebClient
似乎没有抛出任何异常,即使主机上没有互联网访问,因此无法通过catch块检测到这种情况并恢复到本地缓存。
我知道WebClient
的异步API及其相当有趣的回调链,但我认为这太笨拙并且不适合我的设计目标。有没有办法在C#中像上面显示的Java框架代码一样容易地做到这一点?感谢。
答案 0 :(得分:1)
WebClient将超时,但仅在100秒后。
我建议你改用HttpWebRequest。这有一个可设置的超时属性。
请参阅http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx
答案 1 :(得分:1)
此外,对于bobbymond的回答,它是一个WebException,将由WebClient返回,所以这就是你想要捕获的内容:
WebClient wc = new WebClient();
try
{
wc.Credentials = new NetworkCredential("Administrator", "SomePasword", "SomeDomain");
byte[] aspx = wc.DownloadData("http://SomeServer/SomeSub/SomeFile.aspx");
}
catch (WebException we)
{
//Catches any error in the WebClient, including an inability to contact the remote server
}
catch (System.Exception ex)
{
}