【问题标题】:WCF Async methods failure because of bad network由于网络不好,WCF 异步方法失败
【发布时间】:2013-09-26 14:05:49
【问题描述】:

我是 WCF 的新手。我很想知道关于异步方法的两件事:

  1. 当我向服务发送请求时,由于某种原因网络出现故障会发生什么情况?我会遇到任何异常或类似的情况吗?

  2. 如果在服务尝试响应请求时网络出现故障会发生什么?结果会丢失吗?

感谢您的帮助!

【问题讨论】:

    标签: c# wcf asynchronous


    【解决方案1】:

    通过 TCP(包括 HTTP)向 WCF 发送消息大致经历了三个阶段:

    1. 客户端向 WCF 服务发送消息
    2. 只有在成功接收到整个消息后,才会对其进行反序列化,并将其内容传递给相应的服务操作。服务操作运行完成。
    3. 响应(即您从服务操作返回或抛出的内容)被发送到客户端。

    如果在 1. 期间连接丢失,您的服务将看不到该消息,您的客户端将抛出异常。

    如果在 2. 期间连接丢失,我认为(但您可以轻松模拟,例如使用 Thread.Sleep())服务操作会继续执行。

    如果在 3. 期间断开连接,响应将丢失,但操作将运行。

    【讨论】:

    • 不是直接的,因为失败的请求不会在 WCF 管道中结束。如果在请求期间连接丢失,客户端会知道它并可以对其采取行动。
    • 对不起,我问错了问题。有没有办法知道发回响应是否失败?因为消费者依赖于服务的响应。谢谢。
    • @Dilshod 属性SendTimeout 是发送消息和等待服务器回复的超时时间,如果连接断开,您只需等待SendTimeout 和@ 的时间长度987654324@ 将在您 (a) 等待结果的那一行提出。
    【解决方案2】:

    如果服务没有响应,将会抛出异常。该程序将收到异常。 你可以使用 try...catch 块来捕捉它。如果要记录,则写入日志文件。

    根据我的经验,大多数情况下第一次连接需要时间来初始化。 如果服务有响应,有时我会收到 EndpointNotFoundExceptionTimeoutException

    因此,我创建了一个方法来通过向服务传递消息“正在连接”来初始化连接,如果连接建立,服务将返回一个“已连接”消息。 否则,如果它返回异常,我会让它重试。

    我设置重试次数= 5。所以如果连接仍然没有建立,它将循环5次。一旦建立,它将继续下一个过程。

    我们无法控制网络连接,我们无法预料到哪一点,哪一部分会失败。 但是我们可以在服务失败时控制我们的程序。如果服务失败,取决于您想要做什么。可能会清理数据,重新启动进程或立即停止程序并记录错误以进行调查。

    【讨论】:

    • 这非常方便,谢谢。对于在连接不佳的情况下使用 WCF,您有任何其他提示吗?您是否尝试过以不同方式、不同协议或绑定等方式分解数据?您是否与使用原始 TCP 进行比较?我正在编写一个系统,用于通过埃塞俄比亚农村非常不完整的连接进行通信。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多