gpt4 book ai didi

wcf - 在中间层服务中重新抛出强类型 WCF FaultException

转载 作者:行者123 更新时间:2023-12-02 01:26:41 26 4
gpt4 key购买 nike

我有一个非常简单的 3 层项目。有一个与数据存储交互的 DAL(数据访问层)WCF 服务; BLL(业务逻辑层)WCF 服务作为 DAL 服务和客户端 UI 以及 Windows 窗体客户端层之间的中介。

我在我的 DAL 服务中声明了一个 DataContract 作为错误契约:

[DataContract]
public class ValidationFault
{
[DataMember]
public String Message { get; set; }
[DataMember]
public String PropertyName { get; set; }
...
}

我的 DAL 服务有一个用 FaultContract 属性修饰的操作:

[OperationContract]
[FaultContract(typeof(ValidationFault))]
Patient CreatePatient(Patient patient);

CreatePatient 的实现会抛出一个强类型的 FaultException,如下所示:

throw new FaultException<ValidationFault>(new ValidationFault("Patient last name cannot be empty.", "LastName"));

我的 BLL 服务充当 DAL 服务的客户端和 UI 层的服务。在我的 BLL 服务中,我调用了 DAL 服务的 CreatePatient 方法,如果我捕获到 FaultException 错误,我只是想重新抛出它以供客户端处理。相关的 BLL 代码如下所示:

...
catch (FaultException<ValidationFault>)
{
throw;
}

我可以检查 BLL 中的异常,并可以确认它是一个强类型的 FaultException,并且从 DAL 传递的 Detail 部分完好无损。尝试重新抛出异常的 BLL 方法使用与上述 DAL 方法相同的 [FaultContract] 属性进行修饰。

作为 BLL 服务的客户端的 UI 客户端会尝试处理异常并记录/显示适当的信息。麻烦的是,当这个错误到达客户端时,它不再是强类型的 FaultException,而是带有空 Detail 部分的一般 FaultException。

确实 发现,如果不是仅仅在 BLL 方法中重新抛出错误,而是使用相同的参数重新创建它,如下所示:

catch (FaultException<ValidationFault> valEx)
{
throw new FaultException<ValidationFault>(new ValidationFault(valEx.Detail.Message, valEx.Detail.PropertyName));
}

然后它按预期作为强类型 FaultException 到达客户端。

我的问题是:为什么我需要在 BLL 服务中重新创建这个异常?为什么我不能直接通过 DAL 服务抛出的强类型 FaultException?我得到了可以工作的代码,但想了解发生了什么。我想这是某种东西正盯着我的脸,但我终究无法弄明白。

最佳答案

事实上,答案一直都在盯着我看,所以万一这对以后的人有帮助:我的问题是 FaultContract 的 Action 属性。当您使用 FaultContract 属性修饰操作时,除非您明确指定 Action,否则 WCF 会自动为您生成它。此操作包括 FaultException 命名空间,以及生成错误的操作的服务和方法名称。在我的例子中,我的 BLL 层中的服务和方法名称与最初生成异常的 DAL 方法的服务和方法名称不同,因此尽管我的 DAL 和 BLL 层操作都使用相同的属性修饰:

[FaultContract(typeof(ValidationFault))]

... FaultContract 的 Action 不同。因此,当尝试在 BLL 服务中重新抛出 DAL FaultException 时,FaultContract 与 BLL 操作中指定的不匹配,并且 WCF 将异常重新打包为一般 FaultException 而不是强类型异常。

在这种情况下,我的选择是要么在我的 BLL 服务中重新创建 FaultException,这会创建正确的操作,但是当它到达我的客户端时,它似乎来自 BLL 服务;它起源于 DAL 的事实将丢失,除非我明确指定它,或者将 Action 属性添加到 BLL 操作的 FaultContract 属性,并指定 DAL 生成的故障的 Action。至于哪个是更好的想法和更好的做法,这可能是另一个话题,但我现在了解正在发生的事情,这就是我所追求的。

关于wcf - 在中间层服务中重新抛出强类型 WCF FaultException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com