需要帮助将WCF netTcpBinding转换为CustomBinding

时间:2012-02-09 23:05:57

标签: 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>

我主要是使用自定义绑定的安全部分,因为我无法理解所有不同的设置。并且所有内容的名称也不同(与netTcpBinding参数相比)。

如果有必要,我也会提供以下信息:
服务端点通过 serviceBehavior 附加了证书 在我的代码中,我在创建代理时提供了用户名/密码(服务行为在 serviceCredentials 下有<userNameAuthentication userNamePasswordValidationMode="Windows" />;对于netTcpBinding,WCF配置编辑器显示ClientCredentialType=Windows,我猜是默认值)。

更新

我找到了一个潜在的解决方案来解决我的主要问题 - 增加 ChannelInitilizationTimeout - 而无需创建CustomBinding。我会分享这个,在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配置编辑器(在左窗格“Configuration” - &gt; Advanced - &gt; Extensions - &gt; binding extensions - &gt; new - &gt ;给出一个名称,例如“ MyNetTcp ”并指向dll文件)将我的类添加为绑定的扩展名。

之后在WCF app.config中只需将netTcpBinding替换为MyNetTcp(总共有三个引用; <service><endpoint binding="netTcpBinding"></endpoint></service>;中有一个,其他两个是<bindings><netTcpBinding></netTcpBinding></bindings>下的xml标记

如果有人想对原始问题给出正确答案,我会保留这个问题......

1 个答案:

答案 0 :(得分:0)

您可以将netTcpBinding传递到自定义绑定中并执行以下操作。 无法保证反射可以跨版本使用。

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