4

ログイン ボタンをクリックすると、Silverlight 4 (RIA サービスを使用する OOB) でこのエラー InvalidOperationException "userservice operation already in progress" が発生しますが、毎回発生するわけではなく、複数回発生することもあります。エラーを無視して実行し続けると、うまくいくようです。誰がこれを引き起こしているのか知っていますか?

編集: プロジェクトは、「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 e)
System.Windows.Controls.Primitives.ButtonBase.OnClick() で System.Windows.Controls.Button.OnClick() で System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(
System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e) のMouseButtonEventArgs e )
MS.Internal.JoltHelper.FireEvent (IntPtr unmanagedObj、IntPtr unmanagedObjArgs、Int32 argsTypeIndex、Int32 actualArgsTypeIndex、文字列 eventName) で

編集 (詳細)。新しい「Silverlight ビジネス アプリケーション」ソリューションといくつかのマイナーな変更により、一貫して問題を再現することができました。この問題は、サービスの応答が遅いサイトでより多く発生するため、すべての変更は開発ボックスでのユーザー入力を高速化することです。「Silverlight ビジネス アプリケーション」から始めて、2 つのことを行うように変更するとします。1. ログイン ボックスがロードされたらすぐに表示します。2. 有効な認証情報をデフォルトで入力します (入力する必要はありません)。

次に、アプリを実行し、画面が表示されたらすぐに「Enter」(ログイン)を押すと、一貫してエラーが発生します。

私は Fiddler を使用しましたが、実際に 2 つの呼び出しが発生していることを示しています...

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

エラーは、ログインを呼び出すときに GetUser への最初の呼び出しがまだ進行中の場合に発生します。この GetUser への呼び出しはどこから来ていますか? (aspnetDBから資格情報を取得していますか)

GetUser 呼び出しが完了するまで Login を呼び出さないようにするには、どのコードを追加できますか? (「WebContext.Current.Authentication.IsBusy」を試しましたが、getUser の呼び出しが終了してもリセットされないようです。

4

1 に答える 1

4

Silverlight ビジネス アプリケーション テンプレートでは、次のコード行がメソッド内App.xaml.csにありApplication_Startupます。

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

この行により、 (テンプレートにも付属しています) が呼び出さGetUserれます。AuthenticationService基本的に、このGetUserサービス コールはアプリケーションの起動時に発生します。これが、アプリケーションの起動後にユーザーがすぐにログインするという問題の原因となっています。

ユーザーが [ログイン状態を維持する] フィールドをオンにした場合に自動的にサインインさせたくない場合は、この行を から安全に削除できますApplication_Startup。もう 1 つのオプションは、ある種のLoginHelperクラスを作成し、ログインが完了したときにそのクラスでイベントを発生させることです。ログイン コントロールでこのイベントをリッスンし、最初のGetUser呼び出しが完了したときにのみログイン ボタンを有効にします。

他にもいくつかの潜在的な回避策がありますが、プロジェクトのアーキテクチャを知らなければ、推奨することは困難です。お役に立てれば。

于 2011-03-22T01:44:40.690 に答える