【问题标题】:Using WCF, how to catch OptimisticConcurrencyException and throw FaultException使用 WCF,如何捕获 OptimisticConcurrencyException 并抛出 FaultException
【发布时间】:2015-06-02 19:07:50
【问题描述】:

我有一个 WCF 服务,它包含一个实体框架模型。我的类有一个时间戳属性,所以冲突的更新应该抛出一个 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 entity-framework wcf


    【解决方案1】:

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

    因此,从这个意义上说,故障(合同)不是基于 .NET 的,它们是 ws 标准的一部分并且与技术无关。

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

    希望这有点道理。

    【讨论】:

    • 现在说得通了。我意识到生成的 OptimisticConcurrencyException 与 .NET 框架的 OptimisticConcurrencyException 不同。所以,我假设传递该异常是不好的做法,我将创建自己的。
    【解决方案2】:

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

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

    编辑:

    顺便说一句:SOAP 有FaultContract

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

    【讨论】:

    • 起初我没有意识到 wcfsvcutil 正在为 OptimisticConcurrencyException 创建一个新类,而不是重用框架的类。从这个意义上说,例外将是跨平台的。尽管如此,看看重复的问题,我想我将使用创建 FaultContract 并且我的并发异常将包含当前数据库值的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2013-04-09
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多