2013-04-15 176 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(); 
}