2012-10-11 13 views
5

組み込みモードを使用してIsOperationAllowedOnDocumentが呼び出された場合、RavenDBはInvalidOperationExceptionをスローします。RavenDB IsOperationAllowedOnDocumentは組み込みモードではサポートされていません

IsOperationAllowedOnDocument実装では、組み込みモードの呼び出しを調べる節があります。

namespace Raven.Client.Authorization 
{ 
    public static class AuthorizationClientExtensions 
    { 
     public static OperationAllowedResult[] IsOperationAllowedOnDocument(this ISyncAdvancedSessionOperation session, string userId, string operation, params string[] documentIds) 
     { 
      var serverClient = session.DatabaseCommands as ServerClient; 
      if (serverClient == null) 
       throw new InvalidOperationException("Cannot get whatever operation is allowed on document in embedded mode."); 

組み込みモードを使用している以外の回避策はありますか?

お時間をいただきありがとうございます。

答えて

4

いくつかのユニットテストを書きながら、私は同じような状況に遭遇しました。 Jamesが提供したソリューションはうまくいった。しかし、単体テストのための1つのコードパスと、単体テストの目的を打ち消した生産コードのための別のパスを持つことになりました。 2番目のドキュメントストアを作成して最初のドキュメントストアに接続すると、承認拡張メソッドに正常にアクセスできました。このソリューションは、(ドキュメントストアの作成が高価なため)実動コードではあまりうまくいかないかもしれませんが、単体テストでうまく動作します。ここでのコードサンプルは次のとおりです。

using (var documentStore = new EmbeddableDocumentStore 
     { RunInMemory = true, 
      UseEmbeddedHttpServer = true, 
      Configuration = {Port = EmbeddedModePort} }) 
{ 
    documentStore.Initialize(); 
    var url = documentStore.Configuration.ServerUrl; 

    using (var docStoreHttp = new DocumentStore {Url = url}) 
    { 
     docStoreHttp.Initialize(); 

     using (var session = docStoreHttp.OpenSession()) 
     { 
      // now you can run code like: 
      // session.GetAuthorizationFor(), 
      // session.SetAuthorizationFor(), 
      // session.Advanced.IsOperationAllowedOnDocument(), 
      // etc... 
     } 
    } 
} 

言及しなければならない他の項目のカップルがあります:

  1. 最初のドキュメントストアが二つことができるようにtrueに設定UseEmbeddedHttpServerで実行する必要がありますそれにアクセスする。
  2. 私はポート用の定数を作成し、一貫して使用されるようにし、予約されていないポートの使用を確実にしました。
3

これにも遭遇しました。ソースを見ると、その操作を書かれたとおりに行う方法はありません。私は簡単に同じ情報に直接HTTPリクエストを行うことで、私のアプリで機能を複製する可能性があるので、なぜいくつかの本質的な理由があるかどうかわからない:

HttpClient http = new HttpClient(); 
http.BaseAddress = new Uri("http://localhost:8080"); 
var url = new StringBuilder("/authorization/IsAllowed/") 
    .Append(Uri.EscapeUriString(userid)) 
    .Append("?operation=") 
    .Append(Uri.EscapeUriString(operation) 
    .Append("&id=").Append(Uri.EscapeUriString(entityid)); 
http.GetStringAsync(url.ToString()).ContinueWith((response) => 
{ 
    var results = _session.Advanced.DocumentStore.Conventions.CreateSerializer() 
     .Deserialize<OperationAllowedResult[]>(
      new RavenJTokenReader(RavenJToken.Parse(response.Result))); 
}).Wait(); 
関連する問題