Поймать исключение SoapException, выброшенное WebService - PullRequest
6 голосов
/ 15 февраля 2011

Я написал следующий сервис:

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

    }
}

Я бы хотел поймать SoapException, выданный моим WebService, но я всегда иду к блоку FaultException catch, чтобы получить это как сообщение:

System.Web.Services.Protocols.SoapException: сообщение в WebService1.Service1.Test (String str) в [...] WebService1 \ WebService1 \ Service1.asmx.cs: строка 25

Как я мог поймать настоящего SoapException, а не FaultException? Что-то мне не хватает в WebService?

Ответы [ 2 ]

7 голосов
/ 17 февраля 2011

Я думаю, что основная «проблема» заключается в том, что вы используете ссылку на службу WCF для подключения к веб-службе ASP.NET (.asmx).

"Самый простой" способ справиться с этим, вероятно, состоит в использовании веб-ссылки вместо ссылки на службу WCF на клиенте.Это можно сделать, нажав кнопку «Дополнительно» в нижней части диалогового окна «Добавить ссылку на службу», а затем кнопку «Добавить веб-ссылку» в нижней части этого экрана.Я считаю, что использование веб-ссылки должно дать вам SoapException.

Правильный способ (если вы хотите следовать советам Microsoft) состоит в публикации службы WCF вместо службы .asmx.Это целая другая глава, хотя ..

5 голосов
/ 17 февраля 2011

Когда служба ASMX выдает SoapException, .NET возвращает сообщение об ошибке SOAP.

Ошибка SOAP возвращается в сервисную ссылку как исключение типа FaultException. Таким образом, вы никогда не увидите SoapException.

...