让我们想象一下,我有一个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的状态。只有我无法改变远程数据库。那么,请建议我的情况会更好吗?
答案 0 :(得分:1)
以下是需要考虑的一些要点
顺便说一句,如果您希望服务抛出异常,则不要创建全局服务对象,因为它最终会处于故障状态。而是为每个单独的调用创建新实例(使用using语句来处置它的实例)。如果发生任何错误,Bool返回类型不会提供有关错误的详细信息。让它具有void返回类型并包装在try / catch块中,它会提供更改以了解有关错误的来源和性质的更多信息。