Можно ли преобразовать SoapException в FaultException с WCF? - PullRequest
5 голосов
/ 25 февраля 2010

Я мигрирую клиент веб-службы с WSE на WCF .

Я уже изменил внутреннюю ошибку и обработку ошибок, чтобы иметь дело с FaultExceptions вместо SoapExceptions.

В проекте имеется обширный набор тестовых примеров для проверки ошибок и обработки ошибок, который все еще зависит от SoapException. По разным причинам я бы предпочел не переписывать их все.

Можно ли просто преобразовать SoapException в FaultException и тем самым запустить старые тестовые примеры для нового кода обработки ошибок?

Ответы [ 4 ]

2 голосов
/ 25 февраля 2010

как насчет

ловить SoapException и бросать FaultException (решение, а не рекомендация)

catch(SoapException)
{
 throw new FaultException(); // something similar
}
1 голос
/ 31 августа 2010

Как насчет использования инспектора сообщений? Вы проверили IClientMessageInspector ?

Это может выглядеть так:

Инспектор сообщений

public class MessageInspector : IClientMessageInspector
{
     ...

    #region IClientMessageInspector Members
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
      //rethrow your exception here, parsing the Soap message
        if (reply.IsFault)
        {
            MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
            Message copy = buffer.CreateMessage();
            reply = buffer.CreateMessage();

            object faultDetail = //read soap detail here;

            ...
        }
    }
    #endregion

     ...
}

Поведение конечной точки

public class MessageInspectorBehavior : IEndpointBehavior
{
     ...

    #region IEndpointBehavior Members
    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
    {
        MessageInspector inspector = new MessageInspector();
        clientRuntime.MessageInspectors.Add(inspector);  
    }
    #endregion

     ...
}

http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

Я думаю, что хорошей практикой является использовать исключения как ошибки .

0 голосов
/ 25 февраля 2010

Можно попробовать реализовать Интерфейс IErrorHandler . В методе HandleError перезапустите исключение, заключенное в SoapException. В последствии вы должны зарегистрировать его глобально (web.config или что-то еще).

Пример того, как это поможет (псевдокод):

public SoapErrorHandler : IErrorHandler
{
   public void HandleError(Exception ex)
   {
      throw new SoapException(ex.Message, ex);
   }
}
0 голосов
/ 25 февраля 2010

Вы должны иметь возможность использовать EnterpriseLibrary для преобразования FaultException в SoapException на определенной границе, в данном случае клиентского прокси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...