4

로그인 버튼을 클릭 할 때 Silverlight 4 (OOB with RIA Services)에서 InvalidOperationException "사용자 작업이 이미 진행 중"으로 표시되지만 매번 발생하지 않습니다. 때로는 여러 번 발생합니다. 오류를 무시하고 계속 실행하면 작동하는 것 같습니다. 누구든지이 원인을 알고 있습니까?Silverlight 4 로그인 InvalidOperationException "UserService 작업이 이미 진행 중입니다."

EDIT : "Silverlight Business Application"템플릿을 사용하여 프로젝트를 만들었습니다. 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 전자)에서) ( 을 클릭 MS.Internal.JoltHelper.FireEvent에서 System.Windows.Controls.Control.OnMouseLeftButtonUp (제어 Ctrl 키, EventArgs입니다 전자)
(에서
IntPtr입니다 unmanagedObj, IntPtr입니다 unmanagedObjArgs, INT32 argsTypeIndex, INT32 actualArgsTypeIndex, 문자열 EVENTNAME)

편집 (추가 정보). 새로운 'Silverlight Business Application'솔루션과 몇 가지 사소한 변경 사항을 통해 문제를 일관되게 재현 할 수있었습니다. 문제는 서비스가 더 느리게 응답하는 사이트에서 훨씬 더 많이 발생합니다. 따라서 모든 변경 사항은 내 devbox에서 사용자 입력 속도를 높이는 것입니다. 'Silverlight Business Application'로 시작하여 두 가지 작업을 변경하는 경우; 1. 로그인 상자가로드되면 바로 표시하십시오. 2. 일부 유효한 자격 증명에 기본값이 있으므로 입력하지 않아도됩니다.

그런 다음 앱을 실행하고 화면이 표시되면 바로 '입력'(로그인)을 눌러 오류가 계속 발생합니다.

내가 피들러를 사용하고 그것이 로그인을 호출 할 때 인 getUser에 대한 첫 번째 호출가 진행되는 경우 오류가 발생합니다

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

... 실제로 일어나는 두 통화가 있음을 보여줍니다. GetUser에 대한 호출은 어디서 발생합니까? (aspnetDB에서 자격 증명을 가져 오는 것입니까?)

어떤 코드를 추가하면 GetUser 호출이 끝날 때까지 로그인 할 수 있습니까? ("WebContext.Current.Authentication.IsBusy"를 시도했지만 getUser 호출이 완료되면 재설정되지 않는 것 같습니다.)

+0

RIA를 사용중인 것 같습니다. Login 메소드의 사용법을 확인하고 두 번 호출되지 않았는지 확인하십시오. –

+0

@luc 네, RIA를 사용하고 있습니다. 나는 그것을 두 번 부르지 않고 간헐적으로 만 발생한다는 것을 확인했다. 그래서 나는 그것이 명백하다고 생각하지 않는다. 어쨌든 고마워. – tkerwood

+0

코드를 게시 할 수 있습니까? 작동 중에 "로그인"버튼을 비활성화 하시겠습니까? 실현하지 않고 버튼을 두 번 클릭하는 것일 수 있습니다. – ChrisF

답변

4

Silverlight 비즈니스 응용 프로그램 템플릿에서 다음 코드 행은 App.xaml.cs에 있습니다. Application_Startup 방법.이 줄은 (또한 템플릿을 제공하는) 당신의 AuthenticationServiceGetUser에게 전화를하게됩니다

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

.따라서 본질적으로이 GetUser 서비스 호출은 응용 프로그램이 시작될 때 발생합니다. 이는 사용자가 응용 프로그램을 시작한 후 빠르게 로그인하는 데 문제가되는 원인입니다.

"로그인 상태 유지"입력란에 사용자가 자동으로 로그인하는 것을 원하지 않는 경우이 줄을 Application_Startup에서 안전하게 제거 할 수 있습니다. 또 다른 옵션은 일종의 LoginHelper 클래스를 만들고 로그인이 완료되면 해당 클래스에서 이벤트를 시작하는 것입니다. 로그인 제어에서이 이벤트를 듣고 초기 GetUser 호출이 완료되면 로그인 버튼 만 활성화하십시오.

다른 잠재적 인 해결 방법이 있지만 프로젝트의 아키텍처를 알지 못하면 권장하기가 어렵습니다. 희망이 도움이됩니다.

+0

감사합니다. 로그인을 표시하기 전에 LoadUser가 완료 될 때까지 기다리는 코드를 변경했습니다. – tkerwood

+0

안녕하세요, 어떻게 지냈니? 미리 감사드립니다 ... – Jonx

+0

아마도 이런 것 같아요 : 'WebContext.Current.Authentication.LoggedIn + = 새로운 EventHandler (** 사용자 로그인 패스워드 **); ' 'WebContext.Current.Authentication.LoggedOut + = 새로운 EventHandler (** 귀하의 로그 아웃 핸들러 **); ' 로그인 핸들러가 작동하면 로그인 컨트롤을 숨기 만하면됩니다. – flindeberg