捕获WebService抛出的SoapException

Sha*_*pac 6 c# exception try-catch asmx 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我想抓住SoapException我的WebService抛出的东西,但是我总是去FaultExceptioncatch块获取它作为消息:

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

我怎么能抓到一个真实的SoapException,而不是一个FaultException?WebService中有什么我想念的吗?

Cod*_*nia 7

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

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

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

  • 没错,肯定没有必要.但是,混合WCF和ASMX是遇到麻烦的可靠方法.你有更好的解决方案吗?如果是这样,我相信Sharpac会有兴趣听到它,我也会... (4认同)

Joh*_*ers 5

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

SOAP Fault作为类型的异常返回到服务引用FaultException.所以你永远不会看到一个SoapException.