Поймать пользовательское исключение, выброшенное WebMethod в ASP.NET WebService - PullRequest
8 голосов
/ 01 октября 2010

У меня есть классический веб-сервис asp.net (asmx) и веб-метод. Мне нужно создать пользовательское исключение для некоторого случая в моем веб-методе, и мне нужно перехватить это конкретное пользовательское исключение, когда я вызываю метод веб-службы.

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public HelloWorldOutput HelloWorld(HelloWorldInput input)
    {
        try
        {
            // My Code
            return new HelloWorldOutput();
        }
        catch (Exception ex)
        {
            throw new HelloWorldException("Hello World Exception", ex);
        }
    }
}

Классы ввода, вывода и исключения в качестве образца:

public class HelloWorldInput { }
public class HelloWorldOutput { }    

[Serializable]
public class HelloWorldException : Exception
{
    public HelloWorldException() { }
    public HelloWorldException(string message) : base(message) { }
    public HelloWorldException(string message, Exception inner) 
        : base(message, inner) { }
    protected HelloWorldException(
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}

На стороне клиента мне нужно:

public static void Main()
{
    WebService service = new WebService();
    try
    {
        service.HelloWorld(new HelloWorldInput());
    }
    catch (HelloWorldException ex)
    {
        // Do sth with HelloWorldException
    }
    catch (Exception ex)
    {
        // Do sth with Exception
    }
}

Однако я не могу этого сделать, потому что, когда я добавляю ссылку на веб-сервис на клиенте, у меня есть класс обслуживания, классы ввода и вывода, но у меня нет пользовательского класса исключения.

Также другая проблема заключается в том, что у меня также есть проблемы с сериализацией класса Exception (поскольку свойство Exception.Data реализует интерфейс IDictionary)

Есть ли способ сделать это по-моему, или я совершенно не прав, или я что-то упускаю из-за основ веб-сервисов?

Спасибо.

Ответы [ 2 ]

11 голосов
/ 25 ноября 2010

Веб-служба ASP.NET может выдавать любые исключения: SoapException, HelloWorldException или другие.Однако исключение сериализуется в элемент SOAP Fault, и независимо от типа исключения, генерируемого в службе, исключение преобразуется в SoapException при десериализации.Следовательно, невозможно поймать исключение HelloWorldException с моим блоком перехвата в моем вопросе, даже если я разверну исключение HelloWorldException на клиенте.

Для клиента ASP.NET единственный способ - перехватить исключение какSoapException и обработайте его по свойству Actor или SoapFaultSubCode.

Я в основном решил свою проблему, как показано ниже:

Веб-служба:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    public HelloWorldOutput HelloWorld(HelloWorldInput input)
    {
        try
        {
            // My Code
            return new HelloWorldOutput();
        }
        catch (Exception ex)
        {
            throw new SoapException("Hello World Exception",   
                 SoapException.ServerFaultCode, "HelloWorld", ex);
        }
    }
}

Клиент:

public static void Main()
{
    WebService service = new WebService();
    try
    {
        service.HelloWorld(new HelloWorldInput());
    }
    catch (SoapException ex)
    {
        if(ex.Actor == "HelloWorld")
            // Do sth with HelloWorldException
    }
    catch (Exception ex)
    {
        // Do sth with Exception
    }
}

Вместе с документом, который Брайс Фишер написал в своем ответе;эти документы MSDN также содержат полезную информацию о создании и обработке исключений веб-службы.

Как: создавать исключения из веб-службы, созданной с использованием ASP.NET

Как обрабатывать исключения, создаваемые методом веб-службы

4 голосов
/ 01 октября 2010

Это может помочь. Похоже, вы получите исключение SoapException, но вы можете проверить детали, чтобы определить, является ли он вашим классом.

Примечание: чтобы иметь доступ к «HelloWorldException», вы можете вытащить его в отдельную сборку и развернуть на клиенте ...

...