我有一个先前配置为使用nettcp绑定的服务。这种配置有效。
它的绑定看起来像这样:
<binding name="TcpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
transferMode="Streamed" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288"
maxConnections="10" maxReceivedMessageSize="100000000">
<readerQuotas maxNameTableCharCount="1000000" maxStringContentLength="8192000"
maxArrayLength="1638400" />
<security mode="None"/>
</binding>
我尝试将其转换为customBinding以启用leaseTimeout。
<customBinding>
<binding name="TcpBindingCustom" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" >
<windowsStreamSecurity protectionLevel="None" />
<transactionFlow transactionProtocol="OleTransactions"/>
<tcpTransport transferMode="Streamed" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" listenBacklog="10"
maxReceivedMessageSize="100000000" portSharingEnabled="true"
maxBufferSize="65536">
<connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
</tcpTransport>
</binding>
<customBinding>
我没有找到复制<security mode ="None">
当一切都是本地的时,它运行正常,但是一旦部署就会出现以下异常。
System.ServiceModel.Security.SecurityNegotiationException:
The server has rejected the client credentials. --->
System.Security.Authentication.InvalidCredentialException:
The server has rejected the client credentials. --->
System.ComponentModel.Win32Exception:
我没有通过tcpBinding获得这些错误。
如何使用customBinding复制此行为?还有其他东西可能导致SecurityNegotiationException吗?
答案 0 :(得分:1)
我认为您必须使用customBinding element来配置您的服务。我在你提供的配置中没有看到。查看有关配置绑定的good MSDN article以了解如何创建自定义绑定。自定义绑定即将结束本文。
编辑: 对不起,配置块被转过来了。 WCF中的netTcpBinding是secure binding,默认情况下使用Windows身份和传输安全性。虽然您尝试在安全模式设置为“none”的情况下创建它的自定义版本,但实际上您需要匹配netTcpBinding的配置方式。如果MSDN通过展示它们实际上看起来像自定义绑定的方式来记录所有标准绑定,那肯定会很好。试试这个配置:
<customBinding>
<binding name="TcpBindingCustom" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" >
<windowsStreamSecurity protectionLevel="None" />
<transactionFlow transactionProtocol="OleTransactions"/>
<tcpTransport transferMode="Streamed" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" listenBacklog="10"
maxReceivedMessageSize="100000000" portSharingEnabled="true"
maxBufferSize="65536">
<connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
</tcpTransport>
<security authenticationMode="AnonymousForSslNegotiated"/>
</binding>
<customBinding>
答案 1 :(得分:0)
原来答案是从绑定标记中删除所有安全信息。所以在这种情况下删除
<windowsStreamSecurity protectionLevel="None" />
和
<security authenticationMode="AnonymousForSslNegotiated"/>
我遵循了Sixto Saez的一些建议并查看了Reflector中NetTcpBinding的实现。
NetTcpBinding类重写CreateBindingElements方法以包含此逻辑:
SecurityBindingElement item = this.CreateMessageSecurity();
if (item != null)
{
elements.Add(item);
}
使用这样实现的CreateMessageSecurity:
private SecurityBindingElement CreateMessageSecurity()
{
if ((this.security.Mode != SecurityMode.Message)
&& (this.security.Mode != SecurityMode.TransportWithMessageCredential))
{
return null;
}
return this.security.CreateMessageSecurity(this.ReliableSession.Enabled);
}
我的一位同事能够在调试器中逐步执行此逻辑,并使用自定义绑定重现此行为。
如果有人能够生成一个转换表,显示如何使用自定义绑定元素创建基本绑定,那么事实上会非常有用。