关于WCF:WCF-错误/异常与消息

关于WCF:WCF-错误/异常与消息

WCF - Faults / Exceptions versus Messages

我们目前正在争论是否通过WCF通道抛出故障是否比传递指示状态或服务响应的消息更好。

故障具有WCF的内置支持,您可以在其中使用内置错误处理程序并做出相应的反应。但是,这会产生开销,因为.NET中的抛出异常可能会非常昂贵。

消息可以包含必要的信息,以确定您的服务调用发生了什么,而不会引发异常。但是,它确实需要几行重复的代码来分析消息并确定遵循其内容的操作。

我们竭尽全力创建了可在我们的服务中使用的通用消息对象,这就是我们想到的:

1
2
3
4
5
6
7
8
9
10
11
public class ReturnItemDTO< T >
{
    [DataMember]
    public bool Success { get; set; }

    [DataMember]
    public string ErrorMessage { get; set; }

    [DataMember]
    public T Item { get; set; }
}

如果我所有的服务电话都返回了该项目,则我可以始终检查" Success "属性以确定是否一切顺利。然后,我在事件中有一条错误消息字符串,指示出了问题,如果需要,还有一个包含Dto的通用项。

必须将异常信息注销到中央日志记录服务,而不是从该服务传递回。

有什么想法吗?评论?有想法吗?有建议吗?

我的问题有待进一步澄清

我与故障合同有关的一个问题是交流业务规则。

例如,如果有人登录并且其帐户已被锁定,我该如何传达?他们的登录显然失败了,但是由于"帐户锁定"原因而失败。

我也是:

A)使用布尔型,将错误消息锁定在消息帐户上

B)返回带有相关信息的AuthenticatedDTO


This however carries overhead as throwing exceptions in .NET can be quite costly.

您正在将对象序列化和反序列化为XML,并通过一个慢速的网络发送它们。与之相比,抛出异常的开销可以忽略不计。

我通常坚持抛出异常,因为它们清楚地传达出问题,并且所有Web服务工具包都有处理它们的好方法。

在您的示例中,我将抛出UnauthorizedAccessException并显示消息"帐户已锁定"。

说明:默认情况下,.NET wcf服务将异常转换为FaultContracts,但是您可以更改此行为。 MSDN:指定和处理合同和服务中的错误


如果您想像调用任何其他方法一样考虑调用服务,则可能有助于将事情弄清楚。想象一下,如果您调用的每个方法都返回一个状态,而您要检查该方法是对还是错。这样会很乏味。

1
2
3
4
5
6
7
8
result = CallMethod();
if (!result.Success) handleError();

result = CallAnotherMethod();
if (!result.Success) handleError();

result = NotAgain();
if (!result.Success) handleError();

这是结构化错误处理系统的强项之一,就是您可以将实际逻辑与错误处理分开。您不必继续检查,如果没有引发异常,您就知道它是成功的。

1
2
3
4
5
6
7
8
9
10
try
{
    CallMethod();
    CallAnotherMethod();
    NotAgain();
}
catch (Exception e)
{
    handleError();
}

同时,通过返回结果,您将更多的责任放在客户身上。您可能很清楚要检查结果对象中的错误,但是John Doe进来并开始调用您的服务,而忽略了任何错误,因为没有引发异常。这是异常处理的另一大优势,是异常发生并需要注意时,它们可以给我们一个很好的耳光。


我会认真考虑使用FaultContract和FaultException对象来解决此问题。这将使您可以将有意义的错误消息传递回客户端,但仅当出现故障情况时才可以。

不幸的是,我目前正在参加培训课程,因此无法写出完整的答案,但是幸运的是,我正在学习WCF应用程序中的异常管理。我将在今晚发布更多信息。 (对不起,这是一个微不足道的答案)


推荐阅读

    linux命令错误的是?

    linux命令错误的是?,系统,信息,异常,密码,工具,地址,网络,实时,状态,数据,Lin

    linux显示错误命令?

    linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚

    linux退出错误命令的?

    linux退出错误命令的?,系统,电脑,环境,命令,位置,管理,工具,设备,终端,进程,L

    linux没有该命令错误?

    linux没有该命令错误?,系统,第一,环境,命令,分析,软件,异常,文件,目录,空格,

    linux基本命令指示?

    linux基本命令指示?,工作,系统,基础,地址,信息,命令,标准,工具,目录,软件,lin

    linux网络故障命令?

    linux网络故障命令?,网络,地址,系统,信息,状态,命令,环境,服务,电脑,流程,浅

    linux中的通道命令?

    linux中的通道命令?,地址,系统,单位,信息,电脑,工作,设备,网络,权威,命令,Lin

    linux命令错误代码?

    linux命令错误代码?,系统,密码,电脑,网络,手机,网址,软件,代码,设备,老板,Lin

    linux多级通道命令?

    linux多级通道命令?,工作,系统,地址,情况,信息,命令,管理,目录,基础,标准,lin

    linux命令忽略错误?

    linux命令忽略错误?,系统,地址,工作,信息,设备,命令,设计,灵活,观察,标准,lin

    linux更换通道命令?

    linux更换通道命令?,基础,管理,网络,工作,系统,服务,地址,信息,命令,数据,登

    Python导入错误分析

    Python导入错误分析,代码,情况,分析,名字,标准,位置,培训,模块,路径,错误,当

    如何查找python中的错误

    如何查找python中的错误,代码,地方,信息,底部,位置,分析,观察,测试,工作,网

    python的错误和异常

    python的错误和异常,异常,代码,地方,标准,官网,状态,第三,第一,时间,培训,py

    python报302错误怎么办?

    python报302错误怎么办?,网址,情况,状态,代码,培训,错误,对象,页面,报文,暂