代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

从ASP.NET Web服务捕获SoapExceptions

  •  1
  • Ronnie Overby  · 技术社区  · 15 年前

    我有一个使用ASP.NET Web服务的Windows窗体客户端。

    据我所知,当Web服务抛出异常时,它将在.NET客户端软件中转换为SOAPException。

    嗯,我正在捕获SOAPException,但是当我在一个消息框中的客户端显示消息时,它显示的信息比我真正想要显示的要多。

    这是WebService代码:

    throw new ApplicationException("Invalid username or password.");
    

    甚至:

    throw new SoapException("Invalid username or password.", SoapException.ServerFaultCode);
    

    但是在客户端,soapexception的message属性是:

    System.Web.Services.Protocols.SoapException: Invalid username or password. at Transportation.InsertSignUps(String username, String password, SignUp[] signUps) in c:\Documents and Settings\rdoverby\My Documents\Visual Studio 2008\WebSites\www.gtcc.edu\App_Code\webservices\Transportation.cs:line 50

    然而,我真正想展示的是:

    Invalid username or password.

    如何仅从SOAPException提取原始异常的消息。我在vs调试器中浏览了soapexception对象,但找不到我要查找的对象。

    谢谢。

    编辑

    当然,我不想分析那个长字符串。

    8 回复  |  直到 13 年前
        1
  •  1
  •   PeterW    13 年前

    如果异常是一个soapexception(se),那么您可以通过使用se.detail.firstchild.outerxml之类的东西来获得最重要的部分,这是通常放置异常的地方,或者如果您想要批次,则使用se.detail.outerxml。

        2
  •  0
  •   Cerebrus    15 年前

    尝试 Exception.InnerException.Message ?

        3
  •  0
  •   Brad_Z    15 年前

    从SoapException派生新的异常类并直接设置Message属性。

        4
  •  0
  •   Joshua Belden    15 年前

    您需要抛出自己的异常、自定义或其他异常,然后当客户机抛出SOAP异常时,detail属性应该具有您要查找的内容。

        5
  •  0
  •   Ronnie Overby    15 年前

    把它拧紧。我刚从服务返回了一个包含任何错误消息的字符串。如果字符串为空,那么服务就完成了它的工作。

    沉默是金。

        6
  •  0
  •   balint    15 年前

    不要太失望:)

    在本文的帮助下,我也做了同样的事情: http://www.developer.com/net/csharp/article.php/3088231 .

    我已经为我的异常创建了一个自定义类,它甚至还将真正的异常作为一个内嵌在其中的InnerException进行了封装。(我已经为我的每一个已知类型的自定义异常添加了一个独立于语言的ID,以使其更适用于我的客户。)

    在客户端,我只得到innerException和innerException.message是原始文本,没有任何垃圾。

        7
  •  0
  •   John Saunders    15 年前

    对不起,我以前没看到这个。

    我相信真正的答案是 <customErrors/> 在服务器上。我忘记了您想要哪种模式,但是这三种模式中的一种会限制客户端接收到的异常中的细节量。这不是你所期望的,我自己也不相信。有人在另一个论坛上发布了这个答案,当我尝试它时,它起作用了。我没有试过摆脱细节。

        8
  •  0
  •   David Airapetyan    14 年前

    SoapException的Detail属性在SerializedException节点下包含原始序列化异常。

    您可以尝试使用System.Runtime.Serialization.Formatters.Soap.SoapFormatter,使用与此处描述的方法类似的方法反序列化异常: http://blog.irm.se/blogs/eric/archive/2005/03/06/An-ExceptionHandler-that-extract-the-detail-information-from-the-SoapException.aspx

    但是,我无法使它工作,因为我最终从SOAP格式化程序得到了“没有与XML键关联的程序集”错误。

    您可以手动向下钻取serialidexception节点,因为它基本上包含一个base-64编码的SOAP信封:

            string serializedException = exception.Detail.SelectSingleNode("SerializedException").InnerText;
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(serializedException)));
    

    生成的XML文档将包含一些有趣的信息,包括看起来是XML序列化异常的信息。