2011-02-15 135 views
6

我写了下面的服务:捕获由一个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; 
     } 
    } 
} 

而且基本的应用程序进行测试(一个键调用单击事件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) 
    { 

    } 
} 

我'd喜欢赶上由我的WebService抛出的SoapException,但我总是去FaultException catch块a得到那个消息:

服务器无法处理消息 在WebService1.Service1.Test(字符串str)在[...] WebService1 \ WebService1 \ Service1.asmx.cs:行25

怎么可能我赶上一个真正的SoapException,而不是一个FaultException?在WebService中有没有我想念的东西?

回答

7

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

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

正确的方法(如果你想追随微软的建议)将发布一个WCF服务,而不是一个的.asmx服务。这是一个整体的其他章节虽然..

+1

-1:这是没有必要使用旧技术在客户端上,只是因为旧技术在服务器上使用。 – 2011-02-17 14:42:46

5

当ASMX服务抛出一个SoapException,.NET返回SOAP错误消息。

SOAP错误被返回到服务引用作为FaultException类型的异常。所以你永远不会看到SoapException

相关问题