2015-03-20 1 views
4

Для моего клиента WCF исключение, я хотел бы быть в состоянии сделать некоторые Пре и сообщению работы для каждой операции данной конечной точки.WCF Клиент расширяемость: IParemeterInspector.AfterCall и обработки

  • до работы хотели бы использовать имя операции и входные аргументы .
  • сообщения работа хотела бы использовать (снова) имя операции и первоначальных входные аргументы, а также выходов/возвращаемого значениеили любой исключения, что произошли ,

Учитывая это, IParameterInspector (с его BeforeCall и AfterCall) дает мне почти все, что нужно. Проблема заключается в том, что

  • в случае исключения, AfterCall не называется (см here).

Чтобы помочь с этой проблемой, я могу добавить IClientMessageInspector с момента его AfterReceiveReply действительно дозвонились в лице исключения. Это дает мне возможность:

  • определить, произошло ли исключение (ошибка) или нет.
  • сделать сообщению работы в условиях исключения

Вопрос:

  • Есть ли способ с IClientMessageInspector.AfterReceiveReply получить (или создать эквивалент) исключение, представляющий что в конечном итоге будет передано вызывающим. И если да, есть ли способ отметить это исключение, поскольку обработал так, чтобы вызывающие лица не получили исключения?
  • Или, есть ли какой-либо другой механизм расширяемости или другой подход, который я должен использовать для достижения своих целей?
+0

Хотите замените 'FaultExcewption' вашим' Exception'? –

+0

@YohDeadfall, No. –

ответ

0

Если я правильно понял, вы хотите отключить все исключения. Это возможно и может быть сделано путем замены сообщения в IClientMessageInspector.AfterReceiveReply и «десериализации» нового сообщения в IClientMessageFormatter.DeserializeReply.

Приведенный ниже код возвращает значение по умолчанию в качестве результата при возникновении исключения.

Сообщение:

public sealed class FakeMessage : Message 
{ 
    #region Fields 

    private MessageProperties properties; 
    private MessageHeaders headers; 

    #endregion 

    #region Constructors 

    public FakeMessage(MessageVersion version, string action) 
    { 
     this.headers = new MessageHeaders(version); 
     this.headers.Action = action; 
    } 

    #endregion 

    #region Message Members 

    public override MessageHeaders Headers 
    { 
     get { return headers; } 
    } 

    protected override void OnWriteBodyContents(XmlDictionaryWriter writer) 
    { 
     throw new NotSupportedException(); 
    } 

    public override MessageProperties Properties 
    { 
     get 
     { 
      if (this.properties == null) 
      { properties = new MessageProperties(); } 

      return properties; 
     } 
    } 

    public override MessageVersion Version 
    { 
     get { return headers.MessageVersion; } 
    } 

    #endregion 
} 

Сообщение форматировщик:

public sealed class FakeMessageFormatter : IClientMessageFormatter 
{ 
    #region Fields 

    private IClientMessageFormatter baseFormatter; 
    private object defaultReturnValue; 

    #endregion 

    #region Construcotrs 

    public FakeMessageFormatter(IClientMessageFormatter baseFormatter, Type returnType) 
    { 
     this.baseFormatter = baseFormatter; 

     if (returnType.IsValueType && returnType != typeof(void)) 
     { this.defaultReturnValue = Activator.CreateInstance(returnType); } 
    } 

    #endregion 

    #region IClientMessageFormatter Members 

    public object DeserializeReply(Message message, object[] parameters) 
    { 
     if (message is FakeMessage) 
     { return defaultReturnValue; } 

     return baseFormatter.DeserializeReply(message, parameters); 
    } 

    public Message SerializeRequest(MessageVersion messageVersion, object[] parameters) 
    { 
     return baseFormatter.SerializeRequest(messageVersion, parameters); 
    } 

    #endregion 
} 

И, наконец, сообщение инспектор:

public sealed class FakeMessageInspector : IClientMessageInspector 
{ 
    #region IClientMessageInspector Members 

    public void AfterReceiveReply(ref Message reply, object correlationState) 
    { 
     if (reply.IsFault) 
     { reply = new FakeMessage(reply.Version, (string)correlationState); } 
    } 

    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     return request.Headers.Action + "Response"; 
    } 

    #endregion 
} 

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

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