1

非同期コールバックを使用して WCF で記述されたサーバー アプリケーションと、ASP.NET の Web フォーム アプリケーションがあります。2 つのアプリケーション間の通信はすべて問題なく、Web アプリケーションを介してサーバーで公開された関数を呼び出すことができ、サーバーは Web アプリケーションにコールバックを送信できますが、コールバック内の関数が機能する場合もあれば、しないでください。

たとえば、ユーザー名とパスワードをサーバーに送信する Web アプリのログイン ボタンが必要です。サーバーはこれをデータベースと照合し、ログイン情報が正しい場合は、新しいページを開くコールバックを送信する必要があります。ウェブアプリで。

関連するサーバーコードは次のとおりです。

public void Login(String username, String password)
{
    //DoCheckAgainstDatabase(username, password);

    ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
    callback.LoginSuccess();
}

および Web アプリケーション コード:

private InstanceContext _instanceContext;
private ServiceClient _service;
public CallbackHandler MyCallbackHandler = new CallbackHandler();


protected void Page_Load(object sender, EventArgs e)
{
    _instanceContext = new InstanceContext(MyCallbackHandler);
    _backEnd = new ServiceClient(_instanceContext, "NetTcpBinding_IAU", "net.tcp://localhost/MyService/Service");
    _backEnd.Open();
    MyCallbackHandler.LoginSucceeded += OnLoginSucceeded;
}


protected void LoginButton_Click(object sender, EventArgs e)
{
    _backEnd.Login(UsernameTextBox.Text, PasswordTextBox.Text);
}

private void OnLoginSucceeded(object sender, EventArgs e)
{
    ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "window.open('Client.aspx','_self');", true);
}

ブレークポイントを設定して、すべてが正常に機能していることを確認できます。コード 'ScriptManager.RegisterStartupScript...' が常に適切に実行されていないだけです。

これはスレッド化と関係があるのでしょうか? 誰でもこれを修正する方法を提案できますか?

前もって感謝します!デビッド

4

3 に答える 3

0

コールバックが呼び出される前に、ページのライフサイクルが終了する可能性があります。または、少なくとも、起動スクリプトが出力に書き込まれるレンダリング段階に到達する可能性があります。

LoginButton_Clickサービスを同期的に呼び出して、サービス呼び出しが戻るまで先に進まないことは可能ですか?

于 2013-04-15T04:18:46.017 に答える
0

これについてのガイダンスをくれた Ann L. に感謝します。ManualResetEvent を追加し、ボタン クリック メソッドで、コールバックを受信するまで待ってから、新しいページを開きます。

private InstanceContext _instanceContext;
private ServiceClient _service;
public CallbackHandler MyCallbackHandler = new CallbackHandler();
private ManualResetEvent _resetEvent = new ManualResetEvent(false);

protected void Page_Load(object sender, EventArgs e)
{
    _instanceContext = new InstanceContext(MyCallbackHandler);
    _backEnd = new ServiceClient(_instanceContext, "NetTcpBinding_IAU", "net.tcp://localhost/MyService/Service");
    _backEnd.Open();
    MyCallbackHandler.LoginSucceeded += OnLoginSucceeded;
}


protected void LoginButton_Click(object sender, EventArgs e)
{
    _backEnd.Login(UsernameTextBox.Text, PasswordTextBox.Text);
    _resetEvent.WaitOne();

    ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "window.open('Client.aspx','_self');", true);
}

private void OnLoginSucceeded(object sender, EventArgs e)
{
    _resetEvent.Set();
}
于 2013-04-15T11:44:58.490 に答える
0

スクリプトタグが欠落していると思います-window.oppenをそれでラップします

 ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "<script>window.open('Client.aspx','_self');</script>", true);
于 2013-04-15T04:03:21.740 に答える