我有一个使用异步回调和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 ...'不能始终正确执行。
这可能是与线程有关吗?任何人都可以提出一种解决方法吗?
在此先感谢! 大卫
你的意思是'OnLoginSucceeded'并不总是被调用,或者它确实如此,但'RegisterStartupScript'并不总是具有所需的效果? –
OnLoginSucceeded每次都被称为罚款,这是RegisterStartupScript并不总是具有所需的效果。 –
OnLoginSucceeded有时可能会在页面进入Render阶段并呈现其输出后触发。在这种情况下,你不会得到你的启动脚本。您可以通过在PreRender事件处理程序中放置一个断点或一个Debug.WriteLine来测试它,并查看它是否发生在OnLoginSucceeded之前。 –