就我而言,我有一个WCF服务(MyService.svc)。我还有一个实例化和使用服务合同的客户端应用程序。
在服务级别处理异常的最佳方法是什么?"传输"他们以有序和自我描述的方式对待客户?
如果我在WCF服务上有一个未处理的异常,那么好像它会作为CommunicationException回到客户端应用程序。
但是,在服务级别抛出异常并将相同的异常传输到客户端级别的最佳方法是什么?或者,如果我不在服务级别处理异常(或者只是在服务级别重新抛出异常),那么如何将其明确定向到客户端?
或者这通常不是这个SOA如何运作的?什么是正确的方式"这里吗?
谢谢!
答案 0 :(得分:2)
首先,如果要通过协议传递异常,则必须将其包装在错误的情况下,否则会出现服务器错误。
对方法使用FaultContract属性来启用faultContract,并使用创建消息合同来定义要传递的消息:
public interface IMyService
{
[OperationContract]
[FaultContract(typeof(Message))]
void WCFOperation();
}
[DataContract(Namespace = "http://www.mycompany.pt/myservice")]
public class Message
{
String _code;
[DataMember]
public String Code
{
get { return _code; }
set { _code = value; }
}
String _text;
[DataMember]
public String Text
{
get { return _text; }
set { _text = value; }
}
}
要将异常转换为FaultExceptions,我使用以下帮助程序:
class Helper
{
internal static System.ServiceModel.FaultException<Message> ConvertToSoapFault(MyException ex)
{
FaultCode fc = new FaultCode(ex.Code);
return new FaultException<Message>(new Message(){ Text= ex.Message, Code= ex.Code});
}
internal static System.ServiceModel.FaultException ConvertToSoapFault(Exception ex)
{
return new FaultException(ex.Message);
}
}
最后,在operationContract实现中,简单地执行此操作:
public void WCFOperation()
{
try
{
...
}
catch (Exception ex)
{
Helpers.publishError(ex);
throw Helpers.ConvertToSoapFault(ex);
}
}