5

RavenDBは、埋め込みモードを使用してが呼び出されInvalidOperationExceptionたときにスローします。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

2 に答える 2

4

いくつかの単体テストを書いているときに同じ状況に遭遇しました。ジェームズが提供したソリューションは機能しました。ただし、単体テスト用の 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. 最初のドキュメント ストアは、2 番目のドキュメント ストアがアクセスできるように、UseEmbeddedHttpServer を true に設定して実行する必要があります。
  2. ポートの定数を作成して、一貫して使用され、予約されていないポートが確実に使用されるようにしました。
于 2013-09-11T16:32:44.073 に答える
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();
于 2012-12-13T17:44:27.510 に答える