Элемент ошибки WSDL веб-служб .NET 2.0 игнорируется?

У меня есть метод веб-службы, в котором я хотел бы создать некоторые пользовательские исключения, например. 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, я возлагаю на пользователя моего веб-сервиса особую ответственность за их обработку и правильную десериализацию. Оба эти способа не кажутся отличным способом решения этой проблемы и добавляют дополнительные проблемы и код для их решения.

Любой совет?


person Martin    schedule 14.04.2009    source источник
comment
Какой тип клиента вы используете? Если в браузере используется Silverlight, то есть недостатки в обработке ошибок SOAP.   -  person sipsorcery    schedule 14.04.2009
comment
Клиент - это веб-сайт ASP.NET.   -  person Martin    schedule 14.04.2009


Ответы (2)


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

«Обычный» способ, которым это было сделано в 2.0, - это, как вы говорите, добавить сообщение Response с логическим значением успеха, Result и Error.

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

person ThorHalvor    schedule 14.04.2009
comment
Да, я застрял в .NET 2, я знал об этом в WCF и надеялся, что есть способ реализовать [FaultContract (typeof (YourCustomException))] в веб-службе SOAP в .NET 2, которую я не заметил, но похоже это не так. - person Martin; 14.04.2009
comment
Похоже, что лучший способ справиться с этим - следовать шаблону логического успеха, результата и свойства ошибки. Спасибо. - person Martin; 14.04.2009

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

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

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

person John Saunders    schedule 14.04.2009
comment
Я изучил рукописный WSDL, чтобы другие клиенты, работающие с wsdl: fault, могли их подобрать. Но это оставляет людей, реализующих использование .NET, без всякого понимания того, что происходит с исключениями, если они сами не прочитают WDSL. - person Martin; 14.04.2009
comment
Полезно знать, что веб-службы ASMX не поддерживают элемент отказа в WSDL. Я знал, что это не будет проблемой, если я использую WCF, но я не могу этого сделать в данный момент, поэтому надеялся на решение в .NET 2, как указано в заголовке. - person Martin; 14.04.2009
comment
Нет, если ваша служба отправляет правильную ошибку, заполнив свойство Detail SoapException, тогда даже клиент .NET 2.0 получит SoapException с заполненным свойством Detail. Просто не отдельное исключение для каждой ошибки. - person John Saunders; 14.04.2009
comment
Да, я знаю, что есть причины для обновления, но я не могу использовать его в этом проекте, это не мое решение. Выполнение этого с помощью SoapException требует, чтобы клиент (если они .NET являются pre-WCF) должен решить, что делать с подробным XML, который они возвращают. Получите от него ExceptionType. Это правильно? - person Martin; 14.04.2009
comment
да. Это правильно. Я рекомендую формат XML, который делает тип исключения очевидным. Я сделал корневой элемент уникальным для каждого исключения. Это помогло. - person John Saunders; 14.04.2009
comment
Лол, кто-то отметил этот ответ как оскорбительный. Может быть, кто-нибудь из команды веб-сервисов в MS? - person ; 24.08.2010