.Net WFCWeb服务异常处理设计模式

.Net WFCWeb服务异常处理设计模式,第1张

概述我试图在.net wcf服务(特别是支持Silverlight的wcf服务)中提出一个简单易用的设计模式来处理错误.如果在服务方法中抛出异常,silverlight应用程序将看到一个CommunicationException,指出“远程服务器返回错误:NotFound —>”,可能还有一个堆栈跟踪,具体取决于您的设置,这完全没有用,因为它没有告诉你实际的错误,通常真正的错误不是“NotFound 我试图在.net wcf服务(特别是支持Silverlight的wcf服务)中提出一个简单易用的设计模式来处理错误.如果在服务方法中抛出异常,silverlight应用程序将看到一个CommunicationException,指出“远程服务器返回错误:NotFound —>”,可能还有一个堆栈跟踪,具体取决于您的设置,这完全没有用,因为它没有告诉你实际的错误,通常真正的错误不是“NotFound”.

阅读Web服务和wcf服务和异常,您需要抛出soap / wcf标准异常,例如FaultException或SoapException.因此,对于wcf服务,您需要将每个方法包装在try catch中,捕获每个异常,将其包装在FaultException中并抛出它.至少这是我的理解,如果我错了,请纠正我.

所以我创建了我的设计模式:

[ServiceContract(namespace = "http://MyTest")][AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]public class DataAccess{    /// <summary>    /// Error class,handle converting an exception into a FaultException    /// </summary>    [DataContractAttribute]    public class Error    {        private string strMessage_m;        private string strStackTrace_m;        public Error(Exception ex)        {            this.strMessage_m = ex.Message;            this.strStackTrace_m = ex.StackTrace;        }        [DataMemberAttribute]        public string Message        {            get { return this.strMessage_m; }            set { this.strMessage_m = value; }        }        [DataMemberAttribute]        public string StackTrace        {            get { return this.strStackTrace_m; }            set { this.strStackTrace_m = value; }        }        //Convert an exception into a FaultException        public static voID Throw(Exception ex)        {            if (ex is FaultException)            {                throw ex;            }            else            {                throw new FaultException<Error>(new Error(ex));            }        }    }    [OperationContract]    [FaultContract(typeof(Error))]    public voID TestException()    {        try        {            throw new Exception("test");        }        catch (Exception ex)        {            Error.Throw(ex);        }    }}

所以长话短说,我仍然没有在我的silverlight应用程序中得到正确的错误.我检查AsyncCompletedEventArgs.Error对象,它仍然包含一个带有一般错误的CommunicationException对象.帮助我想出一个漂亮的简单设计模式,让我轻松地从服务中抛出正确的异常,并轻松地在应用程序中捕获它.

解决方法 我建议你集中管理WCF服务的错误,而不是在每个方法上放置try / catch.为此,您可以实现 IErrorHandler接口:

public class ErrorHandler : IErrorHandler{    public bool HandleError(Exception error)    {        return true;    }    public voID ProvIDeFault(Exception error,MessageVersion version,ref Message msg)    {        DataAccessFaultContract dafc = new DataAccessFaultContract(error.Message);        var fe = new FaultException<DataAccessFaultContract>(dafc);        Message fault = fe.CreateMessageFault();        string ns = "http://www.example.com/services/FaultContracts/DataAccessFault";        msg = Message.CreateMessage(version,fault,ns);    }}

只要您的一个OperationContract引发异常,就会调用ProvIDeFault方法.它会将异常转换为自定义的FaultContract并将其发送到客户端.这样您就不再需要在每个方法中放置try / catch.您还可以根据抛出的异常发送不同的FaultContract.

在客户端,您需要捕获FaultException< DataAccessFaultContract>每次在Web服务上调用方法时.

总结

以上是内存溢出为你收集整理的.Net WFC / Web服务异常处理设计模式全部内容,希望文章能够帮你解决.Net WFC / Web服务异常处理设计模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1076629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存