使用WCF,如何捕获OptimisticConcurrencyException并抛出FaultException

时间:2015-06-02 19:07:51

标签: .net entity-framework wcf

我有一个WCF服务,其中包含一个Entity Framework模型。我的类有一个timestamp属性,因此冲突的更新应该抛出一个OptimisticConcurrencyException。我的问题是,将此异常传递给客户端的最佳方法是什么,而不假设客户端是.NET?

所以,我将讨论一种方法,我认为这证明了问题。这是一个使用异步方法的WCF服务:

[ServiceContract]
public interface ICarService
{
    [OperationContract]
    [FaultContract(typeof(OptimisticConcurrencyException))]
    Task UpdateCarAsync(Car obj);
}

然后,这是一个ASP.NET MVC客户端:

try {
    await this.repo.UpdateCarAsync(theCar);
}
catch (FaultException<OptimisticConcurrencyException>) {
    ModelState.AddModelError(string.Empty, "Optimistic Concurrency Exception");
}

在这种情况下,WCF服务的客户端知道OptimisticConcurrencyException,因为它已经是.NET客户端。但是,如果这是从其他语言调用的呢?不应该有某种OptimisticConcurrencyException的抽象?

我想我在这里真的很遗憾。所以,一个恰当的例子会有所帮助。

2 个答案:

答案 0 :(得分:1)

WCF遵循* ws标准进行故障(错误)处理。由客户端以正确的方式使用服务定义(wsdl)(我假设您的客户端不共享包含服务定义的程序集)。由于故障合同反映在wsdl文件中,因此客户端可以根据故障进行操作。

因此,从这个意义上讲,Fault(契约)不是基于.NET的,它们是ws标准和技术无关的一部分。

在您的示例中,客户端从服务定义中了解OptimisticConcurrencyException,并在创建(自动)潜在客户端代理时使用该信息。

希望这有点道理。

答案 1 :(得分:0)

此功能基于.NET框架。我认为.NET和eg.:Java异常之间没有一对一的映射。 但是,对于跨平台客户端,我的解决方案是Result DataContract,其中包含IsSuccess bool标记和ExceptionMessage string(以及您的结果对象)太)。

我的服务始终返回并处理特殊情况,但填充ExceptionMessage并将IsSuccess设置为false。客户检查了这些属性。

编辑:

顺便说一句:SOAP有FaultContract

Btw2:这个话题或多或少地重复了WCF/WebService: Interoperable exception handling