【问题标题】:Reading data from a server and detecting network unavailability in C#从服务器读取数据并检测 C# 中的网络不可用
【发布时间】:2013-03-27 00:05:30
【问题描述】:

我有一个简单的任务:从服务器读取数据,如果服务器无法访问(服务器关闭或网络故障),则从本地磁盘缓存加载数据(可能是陈旧的)。

下面是 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 及其相当有趣的回调链,但我认为这太尴尬了,不适合我的设计目标。有没有一种方法可以像上面显示的 Java 框架代码一样轻松地在 C# 中执行此操作?谢谢。

【问题讨论】:

    标签: c# java io network-programming


    【解决方案1】:

    WebClient 将超时,但仅在 100 秒后。

    我建议您改用 HttpWebRequest。这有一个可设置的超时属性。

    http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx

    【讨论】:

    • 有效!我发现 Visual C# 环境在文档方面非常不友好(您从 Netbeans/Eclipse on Java 看到的那种)。请问HttpWebRequest 在网络故障的情况下是否也会引发WebException?我真的需要这个来将我的应用程序切换到离线模式。谢谢。
    • GetResponse() 将在超时时返回 WebException,是的。见:HttpWebRequest.GetResponse Method
    【解决方案2】:

    除了 bobbymond 的回答之外,这是一个 WebClient 将返回的 WebException,所以这就是您要捕获的内容:

    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)
    {
    
    }
    

    【讨论】:

    • 支持WebException 澄清。我在想IOException 应该是它的某种超类。
    • 为此干杯,感谢。是的,很遗憾它不能更具体——我也遇到过这个问题——我很想听听任何知道更好方法的人的意见。
    猜你喜欢
    • 2021-03-31
    • 2013-04-30
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多