WCF / WebService: совместимая обработка исключений - PullRequest
9 голосов
/ 10 января 2011

Я понимаю, что WCF преобразует исключение в ошибку и отправляет его обратно как сообщение SOAP, но мне было интересно, действительно ли это совместимо. Я думаю, мне тяжело понять этот возможный сценарий:

  1. Клиент (Java) вызывает службу WCF (LoginService).
  2. Сервер проверяет правильность авторизации, авторизация пользователя не проходит.
  3. Сервер генерирует исключение UnauthorizedAccessException.
  4. WCF каким-то образом преобразует это в неисправность. (* - см. Также ниже)
  5. Клиент должен уметь читать эту ошибку.

Полагаю, мне просто нелегко понять, как это все еще может быть совместимо, потому что я ожидаю, что Java узнает, как преобразовать сбой SOAP, который .NET кодирует из исключения UnauthorizedAccessException.

  • Кроме того, как .NET на самом деле преобразует исключение в ошибку, то есть в код ошибки, имя и т. Д. Некоторые вещи кажутся «духами», как, например, имя ошибки «UnauthorizedAccessException», но я предпочел бы знать наверняка, чем догадываться.

Ответы [ 3 ]

9 голосов
/ 11 января 2011

Нет "автоматического преобразования".WCF вернет ошибку (я забыл какую), когда у вас есть необработанное исключение.Но так как вы не заявили об этой ошибке, многие, если не большинство, потерпят неудачу, если вы ее вернете.

Вы должны определить свои собственные ошибки и вместо них вернуть их.Обратите внимание:

[DataContract]
public class MySpecialFault
{
    public string MyMessage { get; set; }
}

[ServiceContract]
public interface IMyService
{
    [FaultContract(typeof (MySpecialFault))]
    [OperationContract]
    void MyOperation();
}

public class MyService : IMyService
{
    public void MyOperation()
    {
        try
        {
            // Do something interesting
        }
        catch (SomeExpectedException ex)
        {
            throw new FaultException<MySpecialFault>(
                new MySpecialFault {MyMessage = String.Format("Sorry, but {0}", ex.Message)});
        }
    }
}

Любой клиент, способный обрабатывать ошибки, будет иметь дело с этим.WSDL определит ошибку и увидит ошибку с элементом Detail, содержащим сериализованную версию отправленного экземпляра MySpecialFault.Они смогут прочитать все свойства этого экземпляра.

4 голосов
/ 11 января 2011

Сбои были частью спецификации SOAP начиная с версии 1.1. Они объясняются в спецификации SOAP .

Это зависит от реализаций (WCF, Java и т. Д.), Чтобы гарантировать, что Сбои обрабатываются в соответствии со спецификацией.

Поскольку WCF преобразует исключения FaultException в Faults в соответствии со спецификацией SOAP, исключения FaultException, создаваемые WCF, являются совместимыми.

2 голосов
/ 11 января 2011

Неисправности SOAP совместимы, но классы исключений .Net не годятся для использования при сбоях SOAP. Вместо этого определите свой собственный класс DataContract (например, AccessFault), а затем используйте его в FaultContract. см http://msdn.microsoft.com/en-us/library/ms733841.aspx

Всякий раз, когда возникает исключение UnauthorizedAccessException на границе службы, преобразуйте его в FaultException. Это можно сделать несколькими способами, например, используя блок обработки исключений Microsoft Enterprise Library или реализуя интерфейс IErrorHandler.

...