从Silverlight使用WCF数据服务服务运营商(WebGet)异步

时间:2010-08-12 15:50:16

标签: silverlight asynchronous wcf-data-services odata

在Silverlight的WCF数据服务中尝试使用简单服务运算符时遇到很多问题。我已经验证了以下服务运营商正在浏览器中进行测试:

[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>();
}

然而,无论我如何尝试使用我在各种在线资源中找到的不同方法,我都无法使用这些数据。我已经尝试过在使用DataServiceContext和DataServiceQuery时使用BeginExecute()方法,但是我在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);
}

任何提示?我现在不知道如何从ODlight服务中正确使用Silverlight中的自定义服务运算符(甚至使用我的单元测试项目进行同步)。我还通过Fiddler验证了我正在传递正确的身份验证内容,甚至可以明确设置凭据。为了安全起见,我甚至从执行安全修整的服务运营商那里删除了逻辑。

1 个答案:

答案 0 :(得分:3)

感谢@kaevanshttp://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个项目的集合)最大...大多数都是&lt; 5)。