Использование асинхронного оператора службы данных WCF (WebGet) из Silverlight - PullRequest
4 голосов
/ 12 августа 2010

Возникло много проблем при попытке использовать простой оператор службы в службе данных WCF от Silverlight. Я проверил, работает ли следующий оператор сервиса, протестировав его в браузере:

[WebGet]
public IQueryable<SecurityRole> GetSecurityRolesForUser(string userName) {
  string currentUsername = HttpContext.Current.User.Identity.Name;

  // if username passed in, verify current user is admin and is getting someone else's permissions
  if (!string.IsNullOrEmpty(userName)) {
    if (!SecurityHelper.IsUserAdministrator(currentUsername))
      throw new DataServiceException(401, Properties.Resources.RequiestDeniedInsufficientPermissions);
  } else // else nothing passed in, so get the current user's permissions
    userName = currentUsername;

  return SecurityHelper.GetUserRoles(userName).AsQueryable<SecurityRole>();
}

Однако, как бы я ни пытался использовать разные методы, которые я нашел на разных онлайн-ресурсах, я не смог использовать данные. Я пытался использовать метод BeginExecute () на Boht DataServiceContext и DataServiceQuery, но я продолжаю получать ошибки или данные не возвращаются в метод EndExecute. Я должен сделать что-то простое неправильно ... вот мой код SL:

private void InitUserSecurityRoles() {
  MyEntities context = new MyEntities(new Uri("http://localhost:9999/MyService.svc"));
  context.BeginExecute<SecurityRole>(new Uri("http://localhost:9999/MyService.svc/GetSecurityRolesForUser"), OnComplete, context);

  DataServiceQuery<SecurityRole> query = context.CreateQuery<SecurityRole>("GetSecurityRolesForUser");
  query.BeginExecute(OnComplete, query);
}

private void OnComplete(IAsyncResult result) {
  OnDemandEntities context = result.AsyncState as OnDemandEntities;
  var x = context.EndExecute<SecurityRole>(result);
}

Есть советы? Я сейчас в замешательстве, как правильно использовать пользовательский сервисный оператор из Silverlight (или даже синхронизировать с помощью моего проекта модульного тестирования) из сервиса OData. Я также проверил через Fiddler, что я передаю правильные данные для аутентификации, и даже захожу до того, что явно устанавливаю учетные данные. Просто чтобы быть в безопасности, я даже удалил логику у оператора сервиса, который выполняет подстройку безопасности.

1 Ответ

3 голосов
/ 13 августа 2010

Работает благодаря @ kaevans (http://blogs.msdn.com/b/kaevans):

private void InitUserSecurityRoles() {
  DataServiceContext context = new DataServiceContext(new Uri("http://localhost:9999/MyService.svc"));
  context.BeginExecute<SecurityRole>(new Uri("/GetSecurityRolesForUser", UriKind.Relative),
    (result) => {
      SmartDispatcher.BeginInvoke(
        () => {
          var roles = context.EndExecute<SecurityRole>(result);

          UserSecurityRoles = new List<SecurityRole>();
          foreach (var item in roles) {
            UserSecurityRoles.Add(item);
          }
        });
    }, null);
}

Мне пришлось создать SmartDispatcher , потому что это происходит во ViewModel. В противном случае я мог бы просто использовать статический Dispatcher.BeginInvoke (). Не удалось заставить переменную ролей вставлять в мой UserSecurityRoles (тип List) напрямую по какой-то причине с использованием различных методов, поэтому я просто опустился до того, чтобы добавить его вручную (код не вызывается часто и коллекция не превышает 10 элементов Макс ... большинство <5). </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...