【问题标题】:Pass Value to BeforeSendRequest in WCF将值传递给 WCF 中的 BeforeSendRequest
【发布时间】:2014-06-27 06:15:05
【问题描述】:

我想将附加值(GUID,每个请求不同)传递给 WCF IClientMessageInspector 接口中的 BeforeSendRequest。此值不包含在请求对象中。如何将此值传递给BeforeSendRequest 方法?

【问题讨论】:

  • 写一个单例类,并在 BeforeSendRequest 方法中读取这个值。
  • GUID值和消息有什么联系?
  • 谢谢先生...我有使用 WCF 开发的 API。客户端应用程序连接到此 API(服务 1)并且 API 调用另一个 WCF 服务(服务 2)来获取数据。因此,客户端生成 GUID 并将其与请求一起发送。我想将此 GUID 附加到第二个 wcf 请求的标头(服务 1 到服务 2)。我在服务 1 中实现了 IClientMessageInspector 接口。所以现在我想将该 GUID 传递给 BeforeSendRequest 以附加到 WCF 标头。我该怎么做。
  • 如果可以修改API的代码,可以从OperationContext.Current.IncomingMessageHeaders中获取传入的guid,并将这个guid添加到OperationContext.Current.OutgoingMessageHeaders中。 link
  • 如果你不能实现 IDispatchMessageInspector 和 IClientMessageInspector 接口。读取 AfterReceiveRequest 中的传入 guid,将其存储在 threadstatic 变量中,然后添加到 BeforeSendRequest 中的传出标头中。

标签: c# .net web-services wcf iclientmessageinspector


【解决方案1】:
public class WcfMessageInterceptor : IDispatchMessageInspector, IClientMessageInspector
{
    [ThreadStatic]
    private static string service1GUID;

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        service1GUID = request.Headers.GetHeader("service1-guid-header", "s");
    }

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        var serviceName="";
        if (channel != null && channel.RemoteAddress != null)
        {
            var tmp = request.Headers.Action.Substring(0, request.Headers.Action.LastIndexOf('/'));
            serviceName = tmp.Substring(tmp.LastIndexOf('/') + 1);
        }
        var methodName = request.Headers != null
                                ? request.Headers.Action.Substring(request.Headers.Action.LastIndexOf('/') + 1)
                                : "Action";
        //check if the called service is the right one
        if(serviceName=="Service2"){
            var typedHeader = new MessageHeader(service1GUID);
            var untypedHeader = typedHeader.GetUntypedHeader("service1-guid-in-service2-header", "s");
            request.Headers.Add(untypedHeader);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多