如何处理 WCF 连接失败
本文关键字:WCF 连接 失败 处理 何处理 | 更新日期: 2023-09-27 18:34:25
假设我有 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 的状态。唯一的事情是我不能更改远程数据库。那么,请建议在我的情况下什么会更好?
以下是需要考虑的一些要点
- 在服务器端,您可以捕获各种错误(自定义类派生IErrorHandler(,并向客户端提供特定错误,让他知道错误的原因。 服务
- 的概念是它是客户端和数据库之间的中介,那么为什么客户端会检索数据然后将其发送到服务?
- 一种出路是使用事务,以确保如果发生错误,则不会保留任何更改。
顺便说一下,如果您希望服务引发异常,请不要创建全局服务对象,因为它最终将处于错误状态。改为为每个调用创建新实例(使用 using 语句以释放其实例(。Bool 返回类型不会提供有关错误(如果发生(的大量信息。让它具有 void 返回类型并包装在 try/catch 块中,这会进行更改以了解有关错误来源和性质的更多信息。