a) Windows 2008 R2 マシン A に、Windows サービスで自己ホストされている WCF サービスがあります。net.tcp バインディングを使用しています。ポート共有ではありません。
b) Windows 2008 R2 マシン B の IIS で ASP.Net Web サイトを実行しており (関連性は疑わしいですが、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.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection 接続、TimeoutHelper& timeoutHelper) で System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan タイムアウト) で System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan タイムアウト) で System. System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan タイムアウト) で System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan タイムアウト)。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 アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ) での InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作)System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel チャネル、TimeSpan タイムアウト) System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan タイムアウト、CallOnceManager カスケード) で System.ServiceModel.Channels.ServiceChannel.Call(String アクション、ブール値) System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ) で System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作) でSystem.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel チャネル、TimeSpan タイムアウト) System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan タイムアウト、CallOnceManager カスケード) で System.ServiceModel.Channels.ServiceChannel.Call(String アクション、ブール値) System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ) で System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作) でSystem.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage メソッド呼び出し、ProxyOperationRuntime 操作) で System.ServiceModel.Channels. ServiceChannelProxy.Invoke(IMessage メッセージ)System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage メソッド呼び出し、ProxyOperationRuntime 操作) で System.ServiceModel.Channels. ServiceChannelProxy.Invoke(IMessage メッセージ)
接続/ファイアウォールの問題のように見えますが、そうではありません:
c) (b) とまったく同じコードを使用してマシン A で WCF サービスを呼び出す単純な winforms アプリを作成しました。マシン B で実行すると成功します。
(b) と (c) の両方で、web.config/app.config で何も使用せずに、コードで WCF プロキシを作成します。どちらもエンドポイントに同じ URI を使用しています
したがって、net.tcp 呼び出しを行う IIS と通常のアプリとの間には、いくつかの違いがあるはずです...? これに関連するセキュリティはありますか?
念のため、IIS 内でホストするために通常必要なすべての Windows サービス (WAS、ネット アダプター リスナー、ポート共有など) を有効にしようとしましたが、違いはありませんでした。
ご意見ありがとうございます。