我有一个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的抽象?
我想我在这里真的很遗憾。所以,一个恰当的例子会有所帮助。
答案 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