捕获WebService抛出的SoapException

我写了以下服务:

namespace WebService1 { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class Service1 : System.Web.Services.WebService { [WebMethod] public string Test(string str) { if (string.IsNullOrEmpty(str)) throw new SoapException("message", SoapException.ClientFaultCode); else return str; } } } 

并且有一个基本的应用程序来测试它(一个按钮在click事件上调用Test方法):

 private void button1_Click(object sender, EventArgs e) { ServiceReference1.Service1SoapClient ws = new WindowsFormsApplication1.ServiceReference1.Service1SoapClient(); try { ws.Test(""); } catch (SoapException ex) { //I never go here } catch (FaultException ex) { //always go there } catch (Exception ex) { } } 

我想捕获我的WebService抛出的SoapException ,但我总是转到FaultException catch块获取该消息:

System.Web.Services.Protocols.SoapException:[…] WebService1 \ WebService1 \ Service1.asmx.cs中的WebService1.Service1.Test(String str)的消息:第25行

我怎么能捕获真正的SoapException ,而不是FaultException ? WebService中有什么我想念的吗?

我认为主要的“问题”是您正在使用连接到ASP.NET Web服务(.asmx)的WCF服务引用。

处理此问题的“最简单”方法可能是在客户端上使用Web引用而不是WCF服务引用。 您可以通过选择“添加服务引用”对话框底部的“高级”按钮,然后选择该屏幕底部的“添加Web引用”来执行此操作。 我相信使用Web Reference应该会给你一个SoapException。

正确的方法(如果你想遵循微软的建议)将是发布WCF服务而不是.asmx服务。 这是另一章但是……

当ASMX服务抛出SoapException ,.NET将返回SOAP Fault消息。

SOAP Fault作为FaultException类型的exception返回到服务引用。 所以你永远不会看到SoapException