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