簡體   English   中英

WCF代理行為和參數

[英]WCF Proxy Behaviors and Params

使用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. 使用我的代理的客戶端必須為創建的每個新代理提供參數。

關於第一個問題,在檢查器擴展中,我可以存儲並測試該值以提高效率,但我希望能夠在較早的階段就一次獲取此參數。 具體來說,我希望IContractBehavior本身能夠在AddBindingParameters(...)或ApplyClientBehavior(...)中獲取參數。 但是我不知道如何從那里到達客戶渠道。

關於第二個問題,我不希望通過Extensions.Add()在每個代理實例上設置參數。 我希望可以在客戶端上靜態設置參數,並且仍然可以通過某種方式使行為擴展返回並獲取它。 我不太清楚如何利用局部類來提供幫助。

無論如何要解決這些問題? 是否有將“元參數”傳遞給WCF代理的整體更好的方法?

如果我錯誤地解釋了您的問題,請原諒我。 但是可以解決您兩個問題的解決方案是在檢查器類中放置一個公共靜態成員(屬性或字段)。 因此,客戶端只需要設置一次參數,您的檢查器方法也可以訪問它們。

因此您的檢查器類應如下所示:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM