1

我有一个使用异步回调在 WCF 中编写的服务器应用程序,以及一个在 ASP.NET 中的 webforms 应用程序。两个应用程序之间的所有通信都很好,我可以通过 Web 应用程序调用服务器中公开的函数,服务器可以向 Web 应用程序发送回调,但是有时回调中的函数工作,而其他时候,它们不。

例如,我希望 Web 应用程序上的登录按钮向服务器发送用户名和密码,服务器会根据数据库对此进行检查,如果登录信息正确,它应该发送回调,打开一个新页面在网络应用程序中。

这是相关的服务器代码:

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

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

和网络应用程序代码:

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

我认为你缺少脚本标签 - 用它包装你的 window.oppen,比如

 ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "<script>window.open('Client.aspx','_self');</script>", true);
于 2013-04-15T04:03:21.740 回答
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 回答