私が開発している小さな分散アプリケーションで奇妙な状況が発生しています。
問題
N
同じ Web サービスをデプロイするサーバーを考えてみましょう。
[ServiceContract()]
public interface IWS {
int GetInt(int n);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyWS : IWS {
public MyWS() { /* ... */ }
public int GetInt(int n) { /* ... */ }
}
Web サービスMyWS
は 8 つのステーションに展開されます。これは、同じポートを使用してローカルで行いますが、IIS 7.0 ではアプリケーション ルートが異なります。したがって、あるサーバーには がありますがhttp://localhost:12000/Srv1/MySvc.svc
、別のサーバーにはありますhttp://localhost:12000/Srv4/MySvc.svc
。
通話がルーティングされる
int GetInt(int n)
メソッドは、同じメソッドに対して別の Web サービスを呼び出すことができるメソッドであると考えてください。実際にint GetInt(int n)
は、宛先に到達するまで への呼び出しがルーティングされます。この詳細を気にしないでください。重要なことは、呼び出しがルーティングされることを理解することです。そのため、呼び出しはサーバーに実行されるまでネストされ、実行後、元の呼び出し元が応答を受け取るまで応答が返されます。
MyWS
Web サービスが別の Web サービスを呼び出す場合MyWS
、次のコードを使用します。
public int GetInt(int n) {
/* ... */
if (/* a condition for routing the call */) {
// Call another ws
IWS svc = null;
ServiceEndpoint endpoint = new ServiceEndpoint(
ContractDescription.GetContract(typeof(IWS)),
new BasicHttpBinding(),
new EndpointAddress(/* addr of the other server */));
ChannelFactory<IWS> factory = new ChannelFactory<IWS>(endpoint);
factory.Open();
svc = factory.CreateChannel();
int res = svc.GetInt(n); // <======== HERE
/* ... */
} else {
// Execute the method here!!!
/* ... */
}
/* ... */
}
問題
何が問題ですか?int n
特定のステーションから特定の電話をルーティングしようとすると、その電話が返ってこない! ブロックします!!! でも同じ局から違う引数でかけてみたらOK!
実際にデバッガで試してみたところ、コールチェーンをたどることができました。問題は、呼び出しチェーンが最後のサーバーの前にあるサーバーに到達すると、デバッガーが<======= HERE
マークを付けた行で停止することです! その行は以前の呼び出しで成功しますが、最後の前にサーバーに到達すると、デバッガーは呼び出しに入ることができず、そこで無限に待機します (バインディング構成で 12 時間のタイムアウトを設定しました)。
この問題に関する情報があまりないことを理解しています。問題について何らかの考えを持っている人がいるかどうか知りたいだけです。に関する問題であるかどうかを既に確認しようとしたことを考慮してくださいInstance
。ただし、Multiple
呼び出しがブロックされないように動作しているため、他の呼び出しがブロックされないのはなぜですか???