a)我在Windows 2008 R2机器A上有一个自助托管在Windows服务中的WCF服务。它使用net.tcp绑定。不是端口共享。
b)我在Windows 2008 R2机器B上的IIS上运行ASP.Net网站(作为ApplicationPoolIdentity,虽然我怀疑相关),必须在机器A上调用该服务。我收到此错误:
System.ServiceModel.CommunicationException:套接字连接已中止。这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为' 00:01:00' ---> System.IO.IOException:读取操作失败,请参阅内部异常。 ---> System.ServiceModel.CommunicationException:套接字连接已中止。这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为' 00:01:00' ---> System.Net.Sockets.SocketException:远程主机强制关闭现有连接 在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags) 在System.ServiceModel.Channels.SocketConnection.ReadCore(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时,布尔结束) ---内部异常堆栈跟踪结束--- 在System.ServiceModel.Channels.SocketConnection.ReadCore(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时,布尔结束) 在System.ServiceModel.Channels.SocketConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时) 在System.ServiceModel.Channels.DelegatingConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时) 在System.ServiceModel.Channels.ConnectionStream.Read(Byte []缓冲区,Int32偏移量,Int32计数) 在System.Net.FixedSizeReader.ReadPacket(Byte []缓冲区,Int32偏移量,Int32计数) 在System.Net.Security.NegotiateStream.StartFrameHeader(Byte []缓冲区,Int32偏移量,Int32计数,AsyncProtocolRequest asyncRequest) 在System.Net.Security.NegotiateStream.ProcessRead(Byte []缓冲区,Int32偏移量,Int32计数,AsyncProtocolRequest asyncRequest) ---内部异常堆栈跟踪结束--- 在System.Net.Security.NegotiateStream.ProcessRead(Byte []缓冲区,Int32偏移量,Int32计数,AsyncProtocolRequest asyncRequest) 在System.Net.Security.NegotiateStream.Read(Byte []缓冲区,Int32偏移量,Int32计数) 在System.ServiceModel.Channels.StreamConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时) ---内部异常堆栈跟踪结束---
服务器堆栈跟踪: 在System.ServiceModel.Channels.StreamConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时) 在System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection连接,ArraySegment`1前导码,TimeoutHelper& timeoutHelper) 在System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection连接,TimeoutHelper& timeoutHelper) 在System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan超时) 在System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan超时) 在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时) 在System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan超时) 在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时) 在System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel频道,TimeSpan超时) 在System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan超时,CallOnceManager级联) 在System.ServiceModel.Channels.ServiceChannel.Call(String action,Boolean oneway,ProxyOperationRuntime operation,Object [] ins,Object [] outs,TimeSpan timeout) 在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime操作) 在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
这看起来像连接/防火墙问题,但它不是,如:
c)我创建了一个简单的winforms应用程序,使用与(b)完全相同的代码在机器A上调用WCF服务。在机器B上运行时成功。
(b)和(c)都在代码中创建WCF代理,而不使用web.config / app.config中的任何内容。他们都使用相同的端点URI
因此,在进行net.tcp调用的IIS和常规应用程序之间必定存在一些差异......?这周围有什么安全问题吗?
为了以防万一,我尝试启用您在IIS(WAS,网络适配器监听器,端口共享......)中托管所需的所有Windows服务,但没有任何区别。
非常感谢您的投入。
答案 0 :(得分:1)
您必须将绑定安全性设置为无。
<netTcpBinding >
<binding name="MyServer" >
<security mode="None" />
</binding>
</netTcpBinding>