2011-06-17 7 views
3

データベースから値を取得するために、WCF Webサービスのメソッドを呼び出すことができるSilverlightクライアントがあります。長いクエリの場合、私はそれをキャンセルするオプションをユーザーに与えたい。クライアントのアボートでWCF操作をキャンセルします。

クライアント側で、「キャンセル」を押すと、私はWCFインスタンスで「.Abort()」を呼び出します。しかし、私のWCFサービスは、クライアントがもはや接続されていないことを知らないため、操作を継続します。

私の質問です:WCFサービスがクライアントが接続を強制終了したことを知ることはできますか?

私は私の契約方法でChannel.Closed /フォルトイベントにsuscribing試してみましたが、彼らが起動しません...

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
internal class MyContract: IMyContract 
{ 
    public object QueryDatabase(...) 
    { 
     System.ServiceModel.OperationContext.Current.Channel.Faulted += new System.EventHandler(Channel_Faulted); 
     System.ServiceModel.OperationContext.Current.Channel.Closed += new System.EventHandler(Channel_Faulted); 

     // Perform sql query 
    } 

    void Channel_Faulted(object sender, System.EventArgs e) 
    { 
     // Cancel SQL query here 
    } 
} 

誰もがこれを行う方法を知っていますか? ありがとう!

+0

どのバインディングを使用していますか? – Franchesca

+0

私は現在BasicHttpBindingを使用しています。投稿した記事を見て、信頼できるセッションをサポートしていません。 BasicHttpBindingはもともとより良い相互運用性のために使用されていたので、別のタイプのバインディング(WSHttpBindingなど)を使用することが問題ないかどうか、さらに調査する必要があります... – Mathieu

答えて

2

を持っており、クローズドイベントが実際にあなたのコードサンプルでそれらを使用している方法で使用することができますが、;実行されているが、実際に解約(多くの非同期操作のドンであります使用しているバインディングが信頼性のあるセッションをサポートし、信頼性の高いセッションが有効になっている場合に限ります。使用しているバインディングがそれをサポートしているかどうかを確認し、使用している場合は有効にしてください。

バインディングがこれをサポートしていない場合は、そのバインディングに切り替えることを検討してください。 You can find a list of what is supported for the different bindings here.

0

クライアントは、それがキャンセルを必要と知っているように、サービスに別の要求を送信する必要があります - これは

  1. を前提としたサービスは、アイデンティティの仕事のTEHピースがこのキャンセルクライアント
  2. のための作業を行っていることができますトンが故障キャンセルのAPI
関連する問題