【问题标题】:Catching SoapExceptions from ASP.net Webservices从 ASP.net Web 服务捕获 SoapExceptions
【发布时间】:2009-04-28 14:20:53
【问题描述】:

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

据我了解,当 Web 服务引发异常时,它将在 .net 客户端软件中转换为 SoapException。

好吧,我正在捕获 SoapException,但是当我在消息框中显示客户端上的消息时,它显示的信息比我真正想要显示的要多。

这是网络服务代码:

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

甚至:

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

但是在客户端,SoapException 的 Message 属性是这样的:

System.Web.Services.Protocols.SoapException:用户名或密码无效。在 C:\Documents and Settings\rdoverby\My Documents\Visual Studio 2008\WebSites\www.gtcc.edu\App_Code\webservices\Transportation.cs:line 中的 Transportation.InsertSignUps(String username, String password, SignUp[] signUps) 50

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

用户名或密码无效。

如何从 SoapException 中仅提取原始异常消息。我在 VS 调试器中查看了 SoapException 对象,但找不到我要查找的内容。

谢谢。

编辑

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

【问题讨论】:

  • 我一直在努力解决这个问题,创建一个带有错误消息的简单响应类是最好的选择。看到这个问答:stackoverflow.com/q/32058/945875

标签: .net web-services exception soap exception-handling


【解决方案1】:

如果异常是soapException(se),那么您可以使用se.Detail.FirstChild.OuterXml 之类的东西来获取最重要的位,这是通常放置异常的位置,或者如果您想要很多,那么se.Detail .OuterXml

【讨论】:

    【解决方案2】:

    试过Exception.InnerException.Message

    【讨论】:

    • 是的。内部异常为空。无法从客户端代码中获取原始异常。
    【解决方案3】:

    从SoapException派生一个新的异常类,直接设置message属性。

    【讨论】:

    • 我做不到。我抛出异常、ApplicationException、SoapException、CustomSoapException 还是 YourMomTurnsTricksException 都没有关系。 Web 服务将发送 xml ,消费者会将其转换为 SoapException。
    • 那么额外的文本是在客户端添加的?有趣的。我想你可以操纵异常的序列化,但这听起来很难。可能只是解析字符串:p
    【解决方案4】:

    你需要抛出你自己的异常,自定义的或其他的,然后当客户端抛出soap异常时,Detail属性应该有你想要的。

    【讨论】:

      【解决方案5】:

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

      沉默是金。

      【讨论】:

        【解决方案6】:

        不要太失望:)

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

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

        在客户端,我只是得到InnerException,而InnerException.Message是原文,没有任何垃圾。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            SoapException 的 detail 属性包含 SerializedExeption 节点下的原始序列化异常。

            您可以尝试使用 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 Formatter 收到“没有与 Xml 密钥关联的程序集”错误。

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

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

            生成的 XmlDocument 将包含一些有趣的信息,包括看似 xml 序列化的异常。

            【讨论】:

              猜你喜欢
              • 2011-01-09
              • 2011-02-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-20
              相关资源
              最近更新 更多