次の問題があります。チャットソフトを書いています。クライアント/サーバー メカニズムは、WCF の DualHttpBinding に基づいています。これは、ユーザーがメッセージを送信すると、メッセージが送信されたルームにいるすべてのクライアントがサーバーによって通知されることを意味します。
クライアントのアプリケーションがクラッシュした場合 (何らかの理由で)、クライアント オブジェクトがルームのリストから削除されるようにしたいと考えています。
コールバック操作を呼び出す前に、コールバック チャネルの状態を確認する可能性はありますか? 問題は、(予期しないクラッシュのため) 接続されていないクライアントで操作を呼び出すと、サービスがハングすることです。
public YagzResult SendMessage(Message message)
{
foreach (ChatNodeAddress chatNodeAddress in message.Destination)
{
ChatNode chatNode = chatProvider.FindChatNode(chatNodeAddress);
if (chatNode != null)
{
User currentUser = CurrentUser;
foreach (User user in chatNode)
{
//Don't notify the current client. Deadlock!
if (!user.Equals(currentUser))
{
//Get the callback channel here
IYagzClient client = GetClientByUser(user);
if (client != null)
{
//--> If the client here called is not any more available,
//the service will hang <---
client.OnChatMessageReceived(message);
}
}
}
}
else
{
return YagzResult.ChatNodeNotFound;
}
}
return YagzResult.Ok;
}
クライアントがまだリッスンしているかどうかを確認するにはどうすればよいですか? ところで、クライアントで呼び出される操作はすべて OneWay と宣言され、ConcurrencyMode は "Multiple" に設定されます。
皆さん、ありがとうございました!
はじめまして、
サイモン