Вход в Silverlight 4 InvalidOperationException "Операция UserService уже выполняется" - PullRequest
4 голосов
/ 03 марта 2011

Мы получаем эту ошибку InvalidOperationException «операция userservice уже выполняется» в нашем Silverlight 4 (OOB со службами RIA), когда вы нажимаете кнопку «Вход в систему», но это не происходит каждый раз, а иногда происходит несколько раз.Если я игнорирую ошибку и продолжаю работать, похоже, она работает.Кто-нибудь знает, что вызывает это?

РЕДАКТИРОВАТЬ: проект был создан с использованием шаблона "Silverlight Business Application".

Stack Trace

в System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationService.StartOperation (операция AuthenticationOperation)
в System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationService.Login (параметры LoginParameters * Action`1 completeAction, пользователь объекта 100), пользовательский объект класса 100.LoginUI.LoginForm.LoginButton_Click (Отправитель объекта, EventArgs e)
в System.Windows.Controls.Primitives.ButtonBase.OnClick () в System.Windows.Controls.Button.OnClick () в System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp (MouseButtonEventArgs e)
в System.Windows.Controls.Control.OnMouseLeftButtonUp (контрольный ctrl, EventArgs e)
в MS.Internal.JoltHelper.FireEvent, IntGTeGTTactualArgsTypeIndex, String eventName)

РЕДАКТИРОВАТЬ (Подробнее).Мне удалось последовательно воспроизвести проблему с помощью нового решения «Silverlight Business Application» и нескольких незначительных изменений.Проблема возникает гораздо чаще на сайте, где сервисы реагируют медленнее, поэтому все изменения направлены на ускорение ввода данных пользователем в моем устройстве разработчика.Если вы начнете с «Silverlight Business Application» и измените его, сделав две вещи;1. Показать окно входа в систему, как только оно загрузится.2. по умолчанию в некоторых действительных учетных данных (поэтому вам не нужно вводить их).

Затем запустите приложение и нажмите «enter» (для входа в систему), как только отобразится экран, затем я получаю ошибку постоянно.

Я использовал Fiddler, и он показывает, что на самом деле происходит два вызова ...

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

Ошибка возникает, когда первый вызов GetUser все еще выполняется, когда он вызываетавторизоваться.Откуда этот вызов GetUser?(он получает учетные данные от aspnetDB)

Какой код я могу добавить, чтобы он не вызывал Login до завершения вызова GetUser?(Я пробовал «WebContext.Current.Authentication.IsBusy», но он не сбрасывается после завершения вызова getUser.

1 Ответ

4 голосов
/ 22 марта 2011

В шаблоне бизнес-приложения Silverlight следующую строку кода можно найти в App.xaml.cs в методе Application_Startup.

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

Эта строка вызовет GetUser на вашем AuthenticationService (который также поставляется с шаблоном). По сути, этот GetUser сервисный вызов происходит при запуске приложения, что и вызывает проблему с быстрым входом пользователей после запуска приложения.

Если вы не хотите, чтобы пользователи автоматически входили в систему, если они отметили поле «держать меня в системе», вы можете безопасно удалить эту строку из Application_Startup. Другой вариант - создать какой-то класс LoginHelper и запустить событие в этом классе после завершения входа в систему. Прослушайте это событие в элементе управления входом в систему и активируйте кнопку входа только после завершения первоначального вызова GetUser.

Существует несколько других возможных способов обхода, но без знания архитектуры вашего проекта его трудно рекомендовать. Надеюсь, это поможет.

...