4

我們收到此錯誤出現InvalidOperationException「userservice操作已經在進行中」在我們的Silverlight 4(OOB與RIA服務),當您點擊登錄按鈕,但它不發生每次和有時會發生多次。如果我忽略錯誤並繼續運行,它似乎工作。有誰知道這是什麼原因造成的?Silverlight 4的登錄InvalidOperationException異常「UserService操作已經在進行中」

編輯:項目是使用「Silverlight業務應用程序」模板創建的。

堆棧跟蹤

在System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationService.StartOperation(AuthenticationOperation操作)
在System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationService.Login(LoginParameters參數, Action`1 completeAction,對象userState)
在Reach.SL.LoginUI.LoginForm.LoginButton_Click(對象發件人,EventArgs的)
在System.Windows.Controls.Primitives.ButtonBase.OnClick() 在System.Windows.Controls .Button.On點擊() 在System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs E)
在System.Windows.Controls.Control.OnMouseLeftButtonUp(質控,EventArgs的)
在MS.Internal.JoltHelper.FireEvent( IntPtr的unmanagedObj,IntPtr的unmanagedObjArgs,的Int32 argsTypeIndex,的Int32 actualArgsTypeIndex,字符串eventName的)

EDIT(詳細信息)。 我已經能夠通過一個新的「Silverlight業務應用程序」解決方案和一些小的更改來重現問題。問題發生在服務響應速度較慢的網站上,因此所有更改都會加快用戶在我的開發箱上的輸入。 如果您從「Silverlight業務應用程序」開始並將其更改爲做兩件事情; 1.加載後立即顯示登錄框。 2.默認在一些有效的憑據(所以你不必輸入它們)。

然後運行該應用程序,並在屏幕顯示後立即按'enter'(登錄),然後我一直得到錯誤。

我已經使用小提琴手,它表明,有兩個呼叫實際發生的...

/ClientBin/SilverlightBusinessApp-Web-AuthenticationService.svc/binary/GetUser 
/ClientBin/SilverlightBusinessApp-Web-AuthenticationService.svc/binary/Login 

時的getUser第一個呼叫仍在進行中時,它調用登錄時出現錯誤。 GetUser的這個調用來自哪裏? (它是從aspnetDB獲取憑據)

什麼代碼可以添加,所以它沒有調用登錄,直到GetUser調用完成? (我曾嘗試「WebContext.Current.Authentication.IsBusy」,但它似乎並不時調用的getUser完成復位。

+0

我想你正在使用RIA。檢查Login方法的用法並確保它不被調用兩次。 – 2011-03-03 08:37:45

+0

@luc是的,它使用的是RIA。我已經檢查過它不會調用它兩次,它只是間歇性地發生,所以我不認爲這是顯而易見的。不管怎麼說,還是要謝謝你。 – tkerwood 2011-03-03 08:59:05

+0

你可以發佈你的代碼嗎?您是否在操作過程中禁用了「登錄」按鈕 - 可能是因爲您在沒有意識到的情況下點擊了按鈕兩次。 – ChrisF 2011-03-03 09:04:31

回答

4

在Silverlight業務應用程序模板下面的代碼行可以在App.xaml.cs中找到Application_Startup方法。

WebContext.Current.Authentication.LoadUser(this.Application_UserLoaded, null); 

這條線將導致您的AuthenticationServiceGetUser通話(其中還附帶了模板)。所以基本上這個GetUser服務調用是在應用程序啓動時發生的,這正是導致用戶在啓動應用程序後快速登錄的問題。

如果您不希望用戶在選中「保持登錄狀態」字段時自動登錄,那麼您可以安全地從Application_Startup中刪除該行。另一個選擇是創建某種LoginHelper類並在登錄完成時觸發該類中的事件。在您的登錄控件上收聽此事件,並且僅當初始GetUser呼叫完成時啓用登錄按鈕。

還有其他幾種潛在的解決方法,但不知道項目的體系結構很難推薦。希望這可以幫助。

+0

謝謝,我已將代碼更改爲在顯示登錄之前等待LoadUser完成。 – tkerwood 2011-03-23 02:52:59

+0

你好,你介意你是怎麼做的?提前致謝... – Jonx 2011-09-28 14:18:35

+0

可能是這樣的: 'WebContext.Current.Authentication.LoggedIn + = new EventHandler (**您的登錄處理程序**);' 'WebContext.Current.Authentication.LoggedOut + = new EventHandler (**您的退出處理程序**);' 當登錄處理程序觸發時,只需隱藏登錄控制。 – flindeberg 2011-11-09 11:19:32

相關問題