4

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

任意のヒント?OData サービスから Silverlight からカスタム サービス オペレーターを適切に使用する (または単体テスト プロジェクトを使用して同期する) 方法について、現在途方に暮れています。また、Fiddler を介して、資格情報を明示的に設定しても、正しい認証情報を渡していることを確認しました。安全のために、セキュリティ トリミングを行うサービス オペレーターからロジックを削除しました。

4

1 に答える 1

3

@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);
}

これは ViewModel で発生しているため、 SmartDispatcherを作成する必要がありました。それ以外の場合は、静的な Dispatcher.BeginInvoke() を使用できたはずです。何らかの理由でさまざまな手法を使用して直接 UserSecurityRoles (リスト型) に挿入するロール変数を取得できなかったので、手動で追加することにしました (コードは頻繁に呼び出されず、10 項目を超えるコレクションでもありません)最大...ほとんどは<5です)。

于 2010-08-13T13:24:23.457 に答える