关于c#:WCF错误和异常

关于c#:WCF错误和异常

WCF faults and exceptions

我是第一次写WCF服务。 该服务及其所有客户端(至少到目前为止)均使用C#编写。 该服务必须对传递的数据进行大量输入验证,因此我需要某种方式将无效数据指示回客户端。 我已经阅读了很多有关错误和异常的文章,将异常包装在错误中,以及许多相互矛盾的文章,这些都进一步使我感到困惑。 处理这种情况的正确方法是什么?

我应该完全避免异常并打包结果返回消息吗? 我应该创建一个特殊的Fault或一个特殊的Exception,还是像非WCF验证函数那样抛出ArgumentExceptions?

我现在拥有的代码(受MSDN影响)是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[DataContract]
public class ValidationFault
{
    [DataMember]
    public Dictionary<string, string> Errors { get; private set; }

    [DataMember]
    public bool Fatal { get; private set; }

    [DataMember]
    public Guid SeriesIdentifier { get; private set; }

    public ValidationFault(Guid id, string argument, string error, bool fatal)
    {
        SeriesIdentifier = id;
        Errors = new Dictionary<string, string> {{argument, error}};
        Fatal = fatal;
    }

    public void AddError(string argument, string error, bool fatal)
    {
        Errors.Add(argument, error);
        Fatal |= fatal;
    }
}

在该方法上有[FaultContract(typeof(ValidationFault)))。 那么这是解决这个问题的"正确"方法吗?


从WCF服务中引发异常是没有用的,为什么不呢?因为它作为一个纯粹的错误回来,您需要

a)设置故障以包括异常

b)解析故障以获取异常的文本并查看发生了什么。

所以是的,您需要一个错误而不是一个例外。在您的情况下,我将创建一个自定义错误,其中包含失败列表中失败的字段列表。

请注意,WCF使用字典来使事情变得有趣,这些字典不能进行ISerializable;它具有特殊的处理方式,因此请检查回传的消息在线路上看起来是否良好;如果没有,它会为您返回数组。


如果您要在客户端上进行验证,并且一旦将它们传递到方法(Web服务调用)中时应该具有有效值,那么我将抛出异常。可能是一个例外,表明参数名称对参数无效。 (请参阅:ArgumentException)

但是,您可能不希望依赖客户端来正确验证数据,这使您假设数据可能无效,从而无法进入Web服务。在那种情况下,这并不是真正的例外情况,也不应该例外。在那种情况下,您可以返回一个枚举或一个Result对象,该对象的Status属性设置为枚举(OK,Invalid,Incomplete),并且Message属性设置为特定参数(例如参数名称)。

我将确保在开发过程中发现并修复此类错误。您的质量检查流程应仔细测试客户端的有效使用和无效使用,并且您不希望将这些技术消息传递回客户端。您要做的是更新验证系统,以防止无效数据进入服务呼叫。

我对任何WCF服务的假设都是会有多个UI。现在可能是一个Web UI,但是以后我可能会使用WinForms,WinCE甚至是本机iPhone / Android移动应用程序添加另一个,它与.NET客户端的要求不符。


您可能需要结合策略注入块链接文本来查看" MS模式和实践企业库验证"块,它允许您使用验证属性来装饰数据合同成员,还可以装饰服务实现,以及它的集成使用WCF,这意味着验证失败会作为ArgumentValidationException错误自动返回,每个错误都包含每个验证失败的ValidationDetail对象。

将entlib与WCf结合使用,您无需进行大量代码即可进行大量验证和错误报告


推荐阅读

    linux操作数据库命令?

    linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

    纯命令行linux服务器?

    纯命令行linux服务器?,密码,服务,系统,命令,终端,地址,百度,情况,状态,公共,

    重启服务linux命令?

    重启服务linux命令?,网络,系统,服务,设备,工作,标准,名称,工具,命令,管理,Lin

    linux下载数据命令?

    linux下载数据命令?,软件,工具,数据,系统,代理,官网,网络,名称,网址,盘中,在l

    做数据linux常用命令?

    做数据linux常用命令?,工作,系统,基础,网络,数据,标准,管理,工具,地址,命令,l

    linux下命令访问服务?

    linux下命令访问服务?,服务,密码,状态,信息,地址,网络,认证,系统,号码,名称,l

    linux查重复数据命令?

    linux查重复数据命令?,工具,数据,系统,电脑,名字,资料,代码,百度,标准,技术,

    检查linux服务器命令?

    检查linux服务器命令?,系统,信息,状态,情况,时间,工具,网络,环境,服务,电脑,

    linux同步客户端命令?

    linux同步客户端命令?,时间,网络,服务,系统,认证,状态,管理,信息,分析,地址,l

    linux数据库升级命令?

    linux数据库升级命令?,系统,信息,时间,最新,网络,名字,地址,管理,简介,传播,l

    linux7关闭服务命令?

    linux7关闭服务命令?,系统,软件,服务,命令,电脑,状态,工具,管理,进程,用户,求

    linux命令错误的是?

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

    linux服务器域名命令?

    linux服务器域名命令?,地址,信息,系统,网络,服务,环境,名称,网站,管理,电脑,l

    服务启动linux命令?

    服务启动linux命令?,服务,密码,信息,系统,名称,命令,文件,用户,下面,服务器,l

    linux服务器命令框?

    linux服务器命令框?,系统,情况,状态,信息,数据,软件,指标,服务,在线,工具,lin

    数据库导出linux命令?

    数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命

    服务器linux命令教程?

    服务器linux命令教程?,系统,地址,密码,网络,设备,工作,服务,标准,连续,管理,

    linux删除服务的命令?

    linux删除服务的命令?,服务,系统,软件,平台,名称,管理,环境,产品,命令,文件,

    linux开机服务命令行?

    linux开机服务命令行?,系统,工作,地址,信息,服务,设备,数字,第一,设计,发行,l

    linux服务器分区命令?

    linux服务器分区命令?,系统,管理,信息,设备,时间,命令,基础,首次,平均,情况,l