WCF代理行为和参数

时间:2012-10-26 19:21:56

标签: c# wcf parameters proxy

使用IExtension,我做了一个客户端行为,从任何使用代理的客户端获取参数。虽然我的方法有效,但我希望有更好的方法。

现在,我将分享我目前工作方法的细节,以澄清我正在尝试做的事情。

使用代理的客户端提供如下参数:

var client = new ServiceAlphaClient();

client.InnerChannel.Extensions.Add(new ParameterHolder("hello"));

client.DoSomething("some interesting service invocation");

client.Close();

IExtension ParameterHolder如下所示:

public class ParameterHolder: IExtension<IContextChannel>
{

    public string someParam;

    public ParameterHolder(string someParam)
    {
        this.someParam = someParam;
    }

    #region IExtension required-but-useless stuff
    public void Attach(IContextChannel owner)
    {
    }

    public void Detach(IContextChannel owner)
    {
    }
    #endregion
}

使用该参数的客户端行为扩展如下所示:

    #region IClientMessageInspector
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        //throw new NotImplementedException();
    }

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        ParameterHolder holder = channel.Extensions.Find<ParameterHolder>();

        string param = holder.someParam;

        request.Headers.Add(MessageHeader.CreateHeader(headerName, headerNamespace, someParam));
        return null;
    }
    #endregion

我不喜欢上述所有内容:

  1. ClientMessageInspector扩展名为每个传出请求重复调用Extensions.Find。这既不必要又效率低下。
  2. 使用我的代理的客户端必须为每个创建的新代理提供参数。
  3. 关于第一个问题,在检查器扩展中,我可以存储并测试值以获得更高的效率,但我宁愿能够在较早阶段仅获取此参数一次。具体来说,我希望IContractBehavior本身能够在AddBindingParameters(...)或ApplyClientBehavior(...)中获取参数。但我不知道如何从那里到达客户端频道。

    关于第二个问题,我不想使用Extensions.Add()在每个代理实例上设置参数。我希望我可以在客户端静态设置参数,并以某种方式仍然具有行为扩展名后退并获取它。我无法想象如何利用部分类来提供帮助。

    无论如何要解决这些问题?有一个更好的方法将“元参数”传递给WCF代理吗?

1 个答案:

答案 0 :(得分:0)

如果我错误地解释了您的问题,请原谅我。但是可以解决您的问题的解决方案是在检查器类中放置一个公共静态成员(属性或字段)。因此客户端只需要设置一次参数,您的检查器方法就可以访问它们 太。

所以你的督察班应该是这样的:

Class MyProxyInspector:IClientMessageInspector
{
    public static string MyParam;

    ...

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        request.Headers.Add(MessageHeader.CreateHeader(headerName, headerNamespace, MyParam));
        return null;
    }

} 

和您的客户端,只需要在客户端代码中方便的地方分配MyproxyInspector.MyParam。