我需要帮助将以下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标记
如果有人想对原始问题给出正确答案,我会保留这个问题......
答案 0 :(得分:0)
您可以将netTcpBinding传递到自定义绑定中并执行以下操作。 无法保证反射可以跨版本使用。