我需要帮助将以下 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>

我主要是在自定义绑定(bind)的安全部分苦苦挣扎,因为我无法理解所有不同的设置。并且一切似乎也以不同的方式命名(与 netTcpBinding 参数相比)。

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

更新:

我为我的主要问题找到了一个潜在的解决方案 - 增加 ChannelInitilizationTimeout - 无需创建自定义绑定(bind)。我会分享这个,以防有人在谷歌搜索时绊倒这个线程......

我所做的是创建一个自定义类,它继承自 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 配置编辑器(在左 Pane “配置”-> 高级 -> 扩展 -> 绑定(bind)扩展 -> 新 -> 给一个名称,例如。“ MyNetTcp "并指向 dll 文件)将我的类添加为绑定(bind)的扩展。

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

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

最佳答案

您可以将 netTcpBinding 传入自定义绑定(bind)并执行以下操作。
不能保证反射可以跨版本工作。

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

10-08 13:17