如何处理 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();
        }
    }
}

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

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

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

  1. 在服务器端,您可以捕获各种错误(自定义类派生IErrorHandler(,并向客户端提供特定错误,让他知道错误的原因。
  2. 服务
  3. 的概念是它是客户端和数据库之间的中介,那么为什么客户端会检索数据然后将其发送到服务?
  4. 一种出路是使用事务,以确保如果发生错误,则不会保留任何更改。

顺便说一下,如果您希望服务引发异常,请不要创建全局服务对象,因为它最终将处于错误状态。改为为每个调用创建新实例(使用 using 语句以释放其实例(。Bool 返回类型不会提供有关错误(如果发生(的大量信息。让它具有 void 返回类型并包装在 try/catch 块中,这会进行更改以了解有关错误来源和性质的更多信息。

最新更新