WCF/WebService: совместимая обработка исключений

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

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

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

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

3 ответа

Решение

Там нет "автоматического преобразования". 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. Они смогут прочитать все свойства этого экземпляра.

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

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

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

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

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

Другие вопросы по тегам