Элемент сбоя WSDL веб-служб .NET 2.0 игнорируется? - PullRequest
2 голосов
/ 14 апреля 2009

У меня есть метод веб-службы, в который я хотел бы добавить некоторые пользовательские исключения, например, SomeException, SomeOtherException и т. Д., Которые веб-служба затем превратит в ошибку SOAP, которую клиент сможет обработать. В Java я могу иметь элементы wsdl: fault в элементе wsdl: operation в WSDL. Похоже, это .NET, что это не обслуживается и что нет способа поместить атрибуты в WebMethod, чтобы показать, какие ошибки SOAP могут возникнуть.

Если бы я создал веб-сервис Java с элементами wsdl: fault и добавил бы веб-ссылку на проект .NET, я бы ожидал, что элементы wsdl: fault будут вызывать исключения с соответствующим названием, как и другие объекты. однако это, похоже, не так.

Это тот случай, когда элементы wsdl: fault в WSDL полностью игнорируются .NET? Они являются частью спецификации WSDL, определенной в http://www.w3.org/TR/wsdl, поэтому я не ожидал такого поведения.

Если это так, возможные обходные пути могут возвращать объект результата, который содержит логическое значение успеха / неудачи и сообщение об ошибке / перечисление. Или с помощью SoapExceptions. Если я решу использовать SoapExceptions, то я возлагаю на пользователя моего веб-сервиса упор для обработки и правильной десериализации. Оба из них не кажутся отличным способом справиться с этим и добавить дополнительные проблемы и код для обхода этого.

Любой совет?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2009

Поскольку вы запрашиваете .net 2.0, я думаю, вы знаете, что это «исправлено» в WCF, где вы можете добавить атрибут [FaultContract (typeof (YourCustomException))]].

"Нормальный" способ, которым это было сделано в 2.0, - это, как вы говорите, добавить ответное сообщение со свойством success-boolean, Result и Error.

Обычно вы можете увидеть, как это делается в EntLib.

2 голосов
/ 01 ноября 2016
[return: System.Xml.Serialization.XmlElementAttribute("ResultWS", typeof(ResultWS), Namespace = "http://...")]
[return: System.Xml.Serialization.XmlElementAttribute("ResultFaultWS", typeof(ResultFaultWS), Namespace = "http://...")]
public object SumTest_Operation([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://...")] ParamWS param)
{            
    ResultWS result = null;
    try
    {
        result.Value = param.P1 + param.P2;              

    }
    catch (Exception)
    {
        ResultFaultWS resultFault = new ResultFaultWS();
        resultFault.Status = noOK;

        return resultFault;;
    }
    return result;
}    
2 голосов
/ 14 апреля 2009

Веб-службы ASMX не поддерживали элемент wsdl: fault ни на клиенте, ни на сервере. Они никогда не будут.

Как сказал ThorHalvor , исправление этой ошибки называется "WCF".

Я успешно написал WSDL, включающий элементы wsdl: fault, а затем возвратил эти сбои через веб-сервис ASMX, включив сообщение об ошибке в качестве свойства Detail исключения SoapException. Клиенты Java и WCF правильно увидели это как исключение соответствующего вида.

...