2012-02-09 44 views
4

我需要幫助下面NetTcpBinding的轉換爲等效的CustomBinding:需要幫助轉換WCF NetTcpBinding的到CustomBinding

<bindings> 
    <netTcpBinding> 
     <binding name="secureNetTcp" openTimeout="00:00:25" closeTimeout="00:00:27" receiveTimeout="00:10:10" sendTimeout="00:01:00" 
      listenBacklog="50" maxBufferPoolSize="2097152" maxBufferSize="2097152" maxConnections="50" maxReceivedMessageSize="2097152"> 
      <readerQuotas maxArrayLength="2097152" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" /> 
      <security mode="TransportWithMessageCredential"> 
       <message algorithmSuite="Basic256Sha256" /> 
      </security> 
     </binding> 
    </netTcpBinding> 
</bindings> 

我大多是用自定義綁定的安全部分struggeling,因爲我無法捉摸所有不同的設置。並且所有東西都被命名爲不同(與netTcpBinding參數相比)。

如果有必要,我會提供以下信息,以及:
服務端點必須通過serviceBehavior連接到它的證書。
在我的代碼中,我創建代理時提供了一個用戶名/密碼(服務行爲有<userNameAuthentication userNamePasswordValidationMode="Windows" />serviceCredentials;對於netTcpBinding,WCF配置編輯器顯示ClientCredentialType=Windows,我猜是默認值)。

更新:

我已經找到了我的主要問題潛在的解決方案 - 提高ChannelInitilizationTimeout - 而無需創建一個CustomBinding。我給大家介紹這個,櫃面有人stumbels在這個線程同時googeling ...

我所做的就是創建一個從NetTcpBinding的繼承的自定義類,並在它的構造函數中使用反射來設置ChannelInitilizationTimeout財產。因此保持與NetTcpBinding的完全兼容性。

這裏是我的自定義類的代碼:

public class MyNetTcpBinding : NetTcpBinding 
{ 
    public MyNetTcpBinding() 
    { 
     var fi = typeof(NetTcpBinding).GetField("transport", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     var val = (System.ServiceModel.Channels.TcpTransportBindingElement)fi.GetValue(this); 
     val.ChannelInitializationTimeout = TimeSpan.FromSeconds(10); 
    } 
} 

public class MyBindingElement : NetTcpBindingElement 
{ 
    protected override Type BindingElementType 
    { 
     get { return typeof(MyNetTcpBinding); } 
    } 
} 

public class MyBindingElementCollection : StandardBindingCollectionElement<MyNetTcpBinding, MyBindingElement> 
{ 
} 

編譯這個類(我創建了這個類的一個單獨的DLL項目)後,我用WCF配置編輯器(下左窗格中的「配置」 - >高級 - >擴展 - >綁定擴展 - >新 - >給一個名字,例如「MyNetTcp」並指向dll文件)將我的類添加爲綁定的擴展。

然後在WCF app.config中只需更換netTcpBindingMyNetTcp(總共有三個參考;一個在<service><endpoint binding="netTcpBinding"></endpoint></service>;另外兩個XML標記<bindings><netTcpBinding></netTcpBinding></bindings>下)。

我將離開這個問題,以防有人開想給一個合適的回答原來的問題...

+0

不知道爲什麼任何默認綁定並不能滿足您的需求,但我想看看http://msdn.microsoft.com/en-us/library/ms731172.aspx這SOF http://stackoverflow.com/questions/2235931/wcf-how-to-create-programatically-custom-binding-with-binary-encoding-over-htt – 2012-02-17 23:24:40

+0

@Bryan - 我需要增加ChannelInitilizationTimeout屬性,但那可以只能在CustomBinding中完成。(有時我的客戶端在打開一個服務通道時會遇到異常,跟蹤顯示由於超時(默認5秒)發生了Socket Initilization異常。我的服務器(win 2003 R2,.net4,四核, 4GB內存)不能處理只有30個客戶超出我...)如果我可以以某種方式設置屬性在C#代碼,例如。同時創建WCF服務,這也會讓我滿意,但我還沒有找到通過代碼訪問通道綁定的方法(我只能添加新的)。 – Marko 2012-02-18 08:23:32

+0

是的,我很確定你不能通過代碼訪問該屬性。我相信你已經閱讀過這個http://blogs.msdn.com/b/andreal/archive/2009/12/04/wcf-nettcpbinding-what-to-do-if-the-socket-did-not -complete-of-allotted-timeout-of.aspx和http://msdn.microsoft.com/en-us/library/ms751528.aspx以及http://msdn.microsoft.com/en-us /library/ms731078.aspx。 – 2012-02-18 13:07:34

回答

0

您可以在NetTcpBinding的傳遞到自定義綁定,並做到以下幾點。 不能保證反射會在不同版本之間起作用。

http://blogs.msdn.com/b/sajay/archive/2010/01/29/how-to-create-a-custom-binding-from-a-standardbinding.aspx

+0

找到<>()方法很有意思。唯一的問題是,我在哪裏插入代碼?我目前看到的唯一選項是在創建我的ServiceHost期間,儘管我必須定義整個端點+代碼綁定(不能像我現在這樣使用配置文件),因爲它只能添加端點一個ServiceHost ...(也許可以繼承ServiceHost並覆蓋一些創建方法,以便基於配置文件netTcpBinding注入我的CustomBinding,但我沒有看到這個) – Marko 2012-03-20 15:22:13

+0

我指的是你使用反射更新屬性 - 這可能是您可以創建自定義綁定的位置。如果你想要零件配置和零件代碼。 同樣,您可以使用config中的TcpTransportBindingElement創建自定義綁定。 我們在4.5 btw中遇到了這個問題 - http://msdn.microsoft.com/en-us/library/dd456789%28v=vs.110%29.aspx 此外,對於servicehost的可擴展性,您可以嘗試serviceHostFactory和覆蓋ApplyConfiguration – Sajay 2012-03-21 09:03:07

+0

這是不可能與我的代碼(除非可能當重寫某些方法時)使用你的方法,因爲你的方法基本上創建一個新的綁定或至少新的綁定元素(我不能例如在我的類構造重新定義/重新創建我的班作爲'新的CustomBinding()')。我真的更喜歡的是所有的配置和沒有代碼,但由於沒有人發佈基於配置的答案,我不得不使用我的代碼解決方案,我可以將其作爲擴展插入到配置文件中。我想我會等待.net 4.5中的順序,以恢復到netTcpBinding ... – Marko 2012-03-21 16:07:34