2009-04-14 1 views
2

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

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

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

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

Любые советы?

+0

Какой тип клиента вы используете? Если это Silverlight в браузере, то есть недостатки для обработки ошибок SOAP. – sipwiz

+0

Клиент - это веб-сайт ASP.NET. – Martin

ответ

3

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

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

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

+0

Да, я застрял в .NET 2, я знал об этом в WCF и надеялся, что есть какой-то способ реализовать [FaultContract (typeof (YourCustomException))] в веб-службе SOAP в .NET 2, которую я просматривал, но смотрел вроде это не тот случай. – Martin

+0

Похоже, что лучший способ справиться с этим - следовать шаблону «success-boolean, свойство« Результат и ошибка »». Благодарю. – Martin

2

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

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

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

+0

Я посмотрел на рукописную запись WSDL, чтобы другие клиенты, которые работают с wsdl: fault, смогли их поднять. Но это оставляет людей, использующих .NET, но при этом не разрабатывает то, что происходит с точки зрения исключений, если они не читают сами WDSL. – Martin

+0

Полезно знать, что веб-службы ASMX не поддерживают элемент ошибки в WSDL. Я знал, что это не будет проблемой, если я буду использовать WCF, но я не могу сделать это в данный момент, поэтому надеялся на решение в .NET 2, как в названии. – Martin

+0

Нет, если ваша служба отправляет надлежащую ошибку, заполнив свойство Detail для SoapException, тогда даже клиент .NET 2.0 получит SoapException с заполненным свойством Detail. Просто не отдельное исключение для каждой ошибки. –

2
[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; 
}  

 Смежные вопросы

  • Нет связанных вопросов^_^