2013-04-15 129 views
1

我有一个使用异步回调和ASP.NET中的webforms应用程序在WCF中编写的服务器应用程序。 这两个应用程序之间的所有通信都是正常的,我可以通过Web应用程序调用服务器中的公开函数,并且服务器可以向Web应用程序发送回调函数,但是有时候回调函数内部的函数以及其他时间,他们没有。WCF ASP.NET互操作性

例如,我希望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 ...'不能始终正确执行。

这可能是与线程有关吗?任何人都可以提出一种解决方法吗?

在此先感谢! 大卫

+0

你的意思是'OnLoginSucceeded'并不总是被调用,或者它确实如此,但'RegisterStartupScript'并不总是具有所需的效果? –

+0

OnLoginSucceeded每次都被称为罚款,这是RegisterStartupScript并不总是具有所需的效果。 –

+0

OnLoginSucceeded有时可能会在页面进入Render阶段并呈现其输出后触发。在这种情况下,你不会得到你的启动脚本。您可以通过在PreRender事件处理程序中放置一个断点或一个Debug.WriteLine来测试它,并查看它是否发生在OnLoginSucceeded之前。 –

回答

0

它发生,我认为这是可能你的页面生命周期可能结束 - 或者至少让到Render阶段,这是启动脚本写入输出的地方 - 在调用回调之前。

是否可以同步呼叫您的服务,而不是从LoginButton_Click开始直到服务呼叫返回?

+0

我认为你是对的,我已经在下面发布了修改后的代码。谢谢! –

0

我认为你缺少脚本标记 - 用它换你window.oppen,像

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "<script>window.open('Client.aspx','_self');</script>", true); 
+0

嗨,这似乎并没有解决这个问题,仍然没有按照我预期的那样工作 –

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(); 
}