如何处理WCF连接失败

时间:2016-02-12 16:10:10

标签: c# .net wcf

让我们想象一下,我有一个WCF服务和一个使用某个服务的某些方法的客户端。 在客户端和服务通信期间,有大量关于如何处理各种异常的帖子。只有令我困惑的是以下情况:

服务:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    bool ExportData(object data);
}
public class Service1 : IService1
{
    public bool ExportData(object data)
    {
        // Simulate long operation (i.e. inserting data to the DB)
        Thread.Sleep(1000000);
        return true;
    }
}

客户端:

class Program
{
    static wsService1.Service1Client client1 = new wsService1.Service1Client();

    static void Main(string[] args)
    {
        object data = GetRecordsFromLocalDB();

        bool result = client1.ExportData(data);

        if (result)
        {
            DeleteRecordsFromLocalDB();
        }
    }
}

客户端从本地数据库获取一些数据并将其发送到服务器。如果结果成功,则客户端将从本地DB中删除导出的行。现在想象一下,当数据已经发送到服务器时,突然连接失败(即WiFi被断开)。在这种情况下,数据在服务器端成功处理,但客户端永远不会知道它。是的,我可以捕获连接异常,但我仍然不知道我应该如何处理本地数据库中的记录。我可以稍后再次发送这些数据,但我会在服务器数据库上得到一些重复(即远程数据库允许复制),但我不想多次发送相同的数据。

那么,我的问题是如何处理这类案件?什么是最佳做法? 我检查了一些关于asynchronous operations.的信息但是这仍然是关于我有稳定连接的时候。 作为一种解决方法,我可以将导出操作存储在某些GUID remotelly下,并稍后检查此GUID的状态。只有我无法改变远程数据库。那么,请建议我的情况会更好吗?

1 个答案:

答案 0 :(得分:1)

以下是需要考虑的一些要点

  1. 在服务器端,您可以捕获各种错误(自定义类派生IErrorHandler)并向客户端提供特定错误,让他知道错误的原因。
  2. 服务的概念是它是客户端和数据库之间的中介,那么为什么客户端会检索数据然后将其发送给服务呢?
  3. 一种方法是使用事务,确保如果发生错误,则不会保留任何更改。
  4. 顺便说一句,如果您希望服务抛出异常,则不要创建全局服务对象,因为它最终会处于故障状态。而是为每个单独的调用创建新实例(使用using语句来处置它的实例)。如果发生任何错误,Bool返回类型不会提供有关错误的详细信息。让它具有void返回类型并包装在try / catch块中,它会提供更改以了解有关错误的来源和性质的更多信息。