我有一个这样简单的web服务操作:
[WebMethod] public string HelloWorld() { throw new Exception("HelloWorldException"); return "Hello World"; }
然后我有一个消费Web服务的客户端应用程序,然后调用该操作.显然会抛出异常:-)
try { hwservicens.Service1 service1 = new hwservicens.Service1(); service1.HelloWorld(); } catch(Exception e) { Console.WriteLine(e.ToString()); }
在我的catch块中,我想做的是提取实际异常的消息在我的代码中使用它.捕获的异常是一个SoapException,这是很好的,但它的Message属性是这样的…
System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: HelloWorldException at WebService1.Service1.HelloWorld() in C:\svnroot\Vordur\WebService1\Service1.asmx.cs:line 27 --- End of inner exception stack trace ---
…而InnerException为null.
我想做的是提取InnerException(我的示例中的HelloWorldException文本)的Message属性,任何人都可以帮助吗?如果可以避免,请不要建议解析SoapException的Message属性.
解决方法
不幸的是,我不认为这是可能的.
您在Web服务代码中提升的异常正在编码为Soap Fault,然后将其作为字符串传递回您的客户端代码.
您在SoapException消息中看到的仅仅是Soap错误中的文本,它不会被转换回异常,而只是存储为文本.
如果您希望在错误的条件下返回有用的信息,那么我建议从您的Web服务返回一个可以包含您的信息的“错误”属性的自定义类.
[WebMethod] public ResponseClass HelloWorld() { ResponseClass c = new ResponseClass(); try { throw new Exception("Exception Text"); // The following would be returned on a success c.WasError = false; c.ReturnValue = "Hello World"; } catch(Exception e) { c.WasError = true; c.ErrorMessage = e.Message; return c; } }