gpt4 book ai didi

c# - WCF 客户端扩展性 : IParemeterInspector. AfterCall 和异常处理

转载 作者:行者123 更新时间:2023-11-30 12:58:32 29 4
gpt4 key购买 nike

对于我的 WCF 客户端,我希望能够为给定端点的每个操作执行一些prepost 工作。

  • pre 工作希望使用操作名称输入参数
  • post 工作希望(再次)使用操作名称原始输入参数 以及输出/返回值发生的任何异常

鉴于此,IParameterInspector(及其 BeforeCallAfterCall)为我提供了几乎我需要的一切。问题是

  • 在异常情况下,AfterCall 不会被调用(参见 here )。

为了帮助解决这个问题,我可以添加一个 IClientMessageInspector,因为它的 AfterReceiveReply 确实会在遇到异常时被调用。这使我能够

  • 判断是否发生异常(故障)。
  • 在遇到异常时发布工作

问题:

  • IClientMessageInspector.AfterReceiveReply 有没有办法获取(或创建等效的)exception,表示最终将抛给调用者的内容。如果是这样,是否有办法将异常标记为已处理,这样调用者就不会得到异常?
  • 或者,我是否应该使用其他一些可扩展性机制或其他方法来实现我的目标?

最佳答案

如果我理解正确的话,你想关闭所有异常。这是可能的,并且可以通过替换 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
}

关于c# - WCF 客户端扩展性 : IParemeterInspector. AfterCall 和异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29175123/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com