WPFとWCFを使用してクライアント/サーバーアプリケーションを開発しています。 サーバーアプリケーションは、何らかの問題が発生したときにクライアント要求を実行してコールバックするWCFサービスをホストします。長時間実行されている操作でビジー状態のときにWCFサービスへのPINGの応答
サービスインターフェイスでは、すべてのOneWay
操作のデュプレックスコールバック契約が定義されています。
(簡体字)IService
[ServiceContract(CallbackContract = typeof(ISrvServiceCallback))]
public interface ISrvService
{
[OperationContract(IsOneWay = true)]
void Ping();
[OperationContract(IsOneWay = true)]
void LongRunningOperation();
}
public interface ISrvServiceCallback
{
[OperationContract(IsOneWay = true)]
void PingReply();
[OperationContract(IsOneWay = true)]
void LongRunningOperationStatus(string reply);
}
サービスは、クライアントの呼び出しに応じて状態を変更するいくつかのオブジェクトをmantainする必要があります。このため私はシングルトンサービスを持つことに決めました。
(簡体字)サービス
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SrvService : ISrvService
{
MyObject statusObject;
public void LongRunningOperation()
{
//calling back the client reporting operation status
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>()
.LongRunningOperationStatus("starting long running application");
statusObject.elaborateStatus();
//calling back the client reporting object status
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>()
.LongRunningOperationStatus("object status: " + statusObject.ToString());
}
public void Ping()
{
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>().PingReply();
}
public SrvService()
{
statusObject= ...statusObject init...
}
}
あなたは、サーバアプリケーションが利用可能であるかどうかをチェックするために、クライアント・コール(5秒毎)私はサービスによって公開さのPing操作を持って見ることができるようにネットワーク(各クライアントはサーバー接続アイコンと赤色 =サーバーがありません。緑色 =サーバーが利用できません)。
クライアントが長時間実行される操作を要求すると、サーバはその操作に取り組んで開始し(が赤に変わり、クライアントのサーバー接続のアイコン)ping要求に応答することができません。
長時間実行操作が終了したら、)サーバーは、に、クライアントによって行われたすべての要求を返信し、サーバ接続のアイコンは緑色に引き返します。
長時間の操作が実行されている場合でも、サーバーが常にping要求に応答するようにサービスを開発する方法を知りたいと思います。
- 私はそれが私が サービスのオブジェクトの状態をmantainする
InstanceContextMode.Single
を維持する必要があることを考慮して行うことができますどのように? - WCFサービスにpingを実行して の可用性を確認し、結果をクライアントに視覚的に表示する方法がありますか?
返信いただきありがとうございます@ plast1k!私は非同期に関する小さな知識を持っており、実際にその分野も探っています。 クライアントは、_ThreadPool.QueueUserWorkItem(checkService)_を呼び出す_DispatcherTimer_を使用してサービスにpingを実行します。 _checkService_は_serviceClient.Ping()_を呼び出します。 あなたが投稿したすべてのリンクを見て、自分の問題をどのように解決できるかを見ていきます。 async/awaitシングルトンサービス実装のサンプルコードを用意することは可能でしょうか?クライアントから電話をかけてサーバーから返信する方法を知りたいだけです。 – aDone
問題ありません。私は後でそれを掘ることができるはずです、私は私がそれを見つけると私の投稿を編集します。 – plast1k
@a例が追加されました。 – plast1k