a) 我有一个 WCF 服务,在 Windows 服务中自行托管,在 Windows 2008 R2 机器 A 上。它使用 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[] buffer, Int32 offset, Int32 size,
服务器堆栈跟踪:在 System.ServiceModel.Channels.StreamConnection.Read(Byte[] 缓冲区,Int32 偏移量,Int32 大小,TimeSpan 超时)在 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection 连接,ArraySegment`1 前导码,TimeoutHelper 和 timeoutHelper ) 在 System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout) 在 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) 在 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection 连接,TimeoutHelper 和 timeoutHelper) 在 System .ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout) at System。ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOnceManager .CallOnce(TimeSpan timeout, CallOnceManager cascade) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy .InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 处 System.ServiceModel.Channels 处的 ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)。 ServiceChannelProxy.Invoke(IMessage 消息)System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 处 System.ServiceModel.Channels 处的 ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)。 ServiceChannelProxy.Invoke(IMessage 消息)
这看起来像一个连接/防火墙问题,但它不是,因为:
c) 我制作了一个简单的 winforms 应用程序,它使用与 (b) 完全相同的代码来调用机器 A 上的 WCF 服务。它在机器 B 上运行时成功。
(b) 和 (c) 都在代码中创建 WCF 代理,而不使用 web.config/app.config 中的任何内容。他们都对端点使用相同的 URI
因此,IIS 进行 net.tcp 调用和常规应用程序之间一定存在一些区别......?有什么与此相关的安全性吗?
为了以防万一,我尝试启用通常需要在 IIS 中托管的所有 Windows 服务(WAS、网络适配器侦听器、端口共享......),但没有任何区别。
非常感谢您的意见。