从ASP.net Webservices捕获SoapExceptions

时间:2009-04-28 14:20:53

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

我有一个使用ASP.net网络服务的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: 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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试Exception.InnerException.Message

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您需要抛出自己的异常,自定义或其他任何内容,然后当客户端抛出soap异常时,Detail属性应该包含您要查找的内容。

答案 4 :(得分:0)

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

沉默是金色的。

答案 5 :(得分:0)

不要太失望:)。

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

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

在客户端,我只获取InnerException,而InnerException.Message是原始文本,没有任何垃圾。

答案 6 :(得分:0)

抱歉,我之前没有看到这个。

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

答案 7 :(得分:0)

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序列化的异常。