1

pollingDuplexHttpBinding binding を使用する WCF サーバーと Silverlight クライアントがあります。

接続を閉じて、ユーザーをクリアする EndSession 操作メソッドを呼び出したい

アクティブなユーザーの一覧を表示し、セッションを閉じます ( IsTerminating = true )

    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
    void EndSession();

これによると、 Application_Exit イベントで wcf 操作を呼び出すことはできません。また、

私には「2非常にうるさい」と思われる解決策、

ここでのオプションは何ですか?これが唯一の方法ですか?

1) リンク ソリューションを使用していますか?

2) サーバーは X 秒ごとにメソッドを実行して、デュプレックス オブジェクトの状態が有効であることを確認しますか?

(((ICommunicationObject)clientContract.Value).State != CommunicationState.Opened 

3) その他?! 簡単なビルトインソリューション? なぜ Silverlight は地獄なのか?!

4

1 に答える 1

0

これは、私が試したばかりで機能するソリューションです。そのコアは、あなたの質問からのリンクのコメントに投稿されました! :)

シルバーライトApp.Exitイベント:

    private void Application_Exit(object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(App.SessionId))
            return;

        var page = HtmlPage.Document.DocumentUri;
        UriBuilder builder = new UriBuilder();
        builder.Scheme = page.Scheme;
        builder.Host = page.Host;
        builder.Port = page.Port;
        builder.Path = page.LocalPath;

        string request = builder.Uri.ToString();

        request += "?closing=" + App.SessionId;
        System.Windows.Browser.ScriptObject obj = System.Windows.Browser.HtmlPage.Window.CreateInstance("XMLHttpRequest"); 
        obj.Invoke("open", "POST", request, false);

        obj.Invoke("setRequestHeader", "Content-Type", "application/x-www-form-urlencoded");

        obj.Invoke("send", "");
    }

上記のコードは、Silverlight オブジェクトをホストするページに要求を送信します。このページは ASPX ページであり、次のコード ビハインドがあります。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(this.Request.QueryString["closing"]))
            chatSvc.Quit(this.Request.QueryString["closing"]);
    }

chatSvc明らかに、サービスへの参照とQuit、クライアントが閉じるたびに呼び出すメソッドの参照である必要があります。クエリ文字列を介して必要なパラメーターを渡すことができます。

きれいではありませんが、うまくいきます。

編集:DocumentUri直接使用していない理由は、Silverlight アプリケーションにナビゲーション フレームワークを使用しているためです。

于 2013-04-03T09:33:08.090 に答える