Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理WCF服务错误的最佳实践?_C#_Wcf_Exception - Fatal编程技术网

C# 处理WCF服务错误的最佳实践?

C# 处理WCF服务错误的最佳实践?,c#,wcf,exception,C#,Wcf,Exception,我正在编写某种WCF服务。大多数异常都是在BL实现中捕获并在那里处理的。我的每个API的返回类型都是一个类(名为“result”),包含错误代码、错误消息和成功布尔值 当处理异常时,该类会相应地更新,并最终发送回客户机。 有些例外情况是不正常的,未经处理。目前,我正在使用一个通用的try-catch来包装来自服务层的每个BL调用,以便捕获每个未处理的异常,并创建一个通用的“result”类,其中包含一条通用的失败消息、错误代码和success=false 这是处理异常的好方法还是应该让服务将未处

我正在编写某种WCF服务。大多数异常都是在BL实现中捕获并在那里处理的。我的每个API的返回类型都是一个类(名为“result”),包含错误代码、错误消息和成功布尔值

当处理异常时,该类会相应地更新,并最终发送回客户机。 有些例外情况是不正常的,未经处理。目前,我正在使用一个通用的try-catch来包装来自服务层的每个BL调用,以便捕获每个未处理的异常,并创建一个通用的“result”类,其中包含一条通用的失败消息、错误代码和success=false

这是处理异常的好方法还是应该让服务将未处理的异常抛出给客户端?
您可以假设客户端无法使用异常中的数据,因此它不会从异常中包含的额外信息中获益。

我认为这两种方法都是可行的


我个人不喜欢在WCF上抛出异常,这样客户端可以轻松区分服务器端处理中的错误和连接/协议问题:在第一种情况下,响应将指示失败,在第二种情况下,将抛出异常。

检查异常屏蔽

这是一个根据您在配置文件中指定的规则将服务引发的异常映射到故障契约的过程。这节省了大量使用try/catch块的工作

这里有一个方法可以帮助您:

但一般而言,故障可分为3类:

1) 客户端错误-客户端试图执行不允许的操作,因此需要了解它。例如,未能设置必填字段。-返回解释故障的特定消息

2) 不影响客户端的业务错误。被视为正常操作的错误,例如付款授权检查失败。要么完全从客户端隐藏,要么返回一些消息:“执行请求时出错:请稍后重试…”

3) 系统错误-意外-非正常操作:替换为一般消息:“系统错误:呼叫支持”

但是,在所有情况下,关键是要删除堆栈跟踪,特别是当它是面向公众的服务时

使用屏蔽时,您将有3个涵盖上述场景的故障契约,并在屏蔽配置中适当设置文本


请注意,您通常希望在开发过程中关闭屏蔽,因为这会使调试系统非常痛苦

就个人而言,我不会公开未处理的异常并将其传播给客户端。我将定义客户可能感兴趣的那些异常,并且只传播这些异常。与客户端想要做的事情没有直接关系的异常(ArgumentException可以将reason设置为“CustomerId不能超过20个字符”等)我会在服务中处理,只指出服务端发生了某种内部服务器错误,导致执行中断,这意味着客户端尝试运行的操作无法完成。我之所以这样做,是因为客户端无法根据内部服务器错误采取任何操作。在引发ArgumentException的情况下,他们可以通过再次验证参数并重试该操作来修复InParam


不确定这是否真的是你要问的,但希望它至少能给你一些想法。

我和其他人不同。我认为HTTP方法GET、POST、PUT、DELETE同样支持CRUD操作,HTTP响应代码200、500等支持成功/失败,我认为这是适合使用的。500结果仍然有一个HTTP响应主体,这样的主体是完全可读的(只要IIS没有吐出HTML;您可以控制它)。同时,与WCF中的MicrosoftSOAP一样,XML协议实现已经用错误协议包装了异常


如果要抛出异常,请抛出它们。这样做时只需记录它们,以便使用者可以相应地计划。

如果您让未处理的异常退出WCF服务,这可能会产生不良影响,例如通信通道处于故障状态,而在会话场景中,客户端不能再使用同一个客户端代理实例,但必须创建一个新实例并启动新会话。总的来说,我认为控制WCF服务中出现的错误并向客户提供有用的信息是很好的。看看。这个接口让您可以控制SOAP错误生成的、未处理的异常,并允许您执行额外的任务,如日志记录,并允许您决定在会话绑定的情况下是否保留会话。您可以通过WCF扩展性(如服务、端点、契约、操作行为)添加自定义错误处理程序


请注意,在发送响应消息之前会调用IErrorHandler。因此,在序列化、编码等过程中,通道堆栈中仍有可能发生未经处理的异常。

请注意:使用WCF REST服务时,引发WebFaultException实际上映射到HttpStatusCode,这与设置WebOperationContext.Current.OutgoingResponse.StatusCode相比非常有用。那么,您最终选择了不同的方式吗?