【问题标题】:Error Handling with WCF Service and Client ApplicationWCF 服务和客户端应用程序的错误处理
【发布时间】:2014-03-22 14:09:26
【问题描述】:

就我而言,我有一个 WCF 服务 (MyService.svc)。我还有一个正在实例化和使用服务合同的客户端应用程序。

在服务级别处理异常并以有序和自我描述的方式“传输”给客户端的最佳方式是什么?

如果我在 WCF 服务上有一个未处理的异常,它似乎会以 CommunicationException 的形式返回客户端应用程序。

但是,在服务级别引发异常并将相同的异常传输到客户端级别的最佳方法是什么?或者,如果我不在服务级别处理异常(或者只是在服务级别重新抛出它),如何将其明确定向到客户端?

或者这不是这个 SOA 通常的工作方式吗?这里的“正确方法”是什么?

谢谢!

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    首先,如果你想通过协议传递异常,你必须将它包装在一个faultexception中,否则你会得到一个服务器错误。

    在方法上使用 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);
            }
        }
    

    【讨论】:

    • Helpers.publishError 完成了什么?也许记录?
    • 是的,只是记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2010-09-22
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多