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

Using WCF, how to catch OptimisticConcurrencyException and throw FaultException

我有一个 WCF 服务,其中包含一个 Entity Framework 模型。我的 class 有一个时间戳属性,所以冲突的更新应该抛出一个 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 的抽象吗?

我想我真的错过了一些东西。所以,一个合适的例子会有所帮助。

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

我的服务总是返回并处理异常情况,但它填充了 ExceptionMessage 并将 IsSuccess 设置为 false。客户检查了这些属性。

编辑:

顺便说一句:SOAP 有 FaultContract

顺便说一句:这个话题或多或少重复了WCF/WebService: Interoperable exception handling

WCF 遵循*ws 故障(错误)处理标准。以正确的方式使用服务定义 (wsdl) 取决于客户端(我假设您的客户端没有共享包含服务定义的程序集)。由于故障契约反映在 wsdl 文件中,因此由客户端对故障采取行动。

因此,从这个意义上讲,Fault(合同)不是基于 .NET 的,它们是 ws 标准和技术不可知论者的一部分。

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

希望这有点道理。