【发布时间】:2012-02-09 23:05:56
【问题描述】:
我需要帮助将以下 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。我会分享这个,以防有人在谷歌搜索时绊倒这个线程......
我所做的是创建一个继承自 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 中只需将 netTcpBinding 替换为 MyNetTcp 即可(共有三个引用;一个在 <service><endpoint binding="netTcpBinding"></endpoint></service>; 中,另外两个是 <bindings><netTcpBinding></netTcpBinding></bindings> 下的 xml 标签)。
如果有人想对原始问题给出正确答案,我将保留此问题...
【问题讨论】:
-
不确定为什么任何默认绑定都不能满足您的需求,但我会看看 msdn.microsoft.com/en-us/library/ms731172.aspx 和这个 SOF stackoverflow.com/questions/2235931/…
-
@Bryan - 我需要增加 ChannelInitilizationTimeout 属性,但这只能在 CustomBinding 中完成。 (有时我的客户在打开服务的通道时遇到异常,跟踪显示由于超时(默认 5 秒)发生了套接字初始化异常。我的服务器(win 2003 R2,.net4,四核, 4GB ram)只能处理 30 个客户端超出了我的范围......)如果我能以某种方式在 c# 代码中设置属性,例如。在创建 WCF 服务时,这也会让我满意,但我还没有找到通过代码访问通道绑定的方法(我只能添加新的)。
-
是的,我很确定您无法通过代码访问该属性。我相信你已经读过这个blogs.msdn.com/b/andreal/archive/2009/12/04/… 和这个msdn.microsoft.com/en-us/library/ms751528.aspx 和这个msdn.microsoft.com/en-us/library/ms731078.aspx。
-
@BryanCorazza - 我确实已经读过前两个,第三个我以前没有读过。尽管如此,这些页面对我的问题都没有帮助(CustomBinding 中的 TransportWithMessageCredential 是什么?是 Windows 身份验证 Kerberos 还是 CustomBinding 中的用户名?是否需要更改 CustomBinding 中的其他 50 个设置中的任何一个才能获得相当于我的例子?等...)
标签: wcf