2012-10-11 23 views
5

RavenDB ném InvalidOperationException khi IsOperationAllowedOnDocument được gọi bằng chế độ được nhúng.RavenDB IsOperationAllowedOnTài liệu không được hỗ trợ trong Chế độ nhúng

Tôi có thể thấy trong việc thực hiện IsOperationAllowedOnDocument một điều khoản kiểm tra các cuộc gọi ở chế độ được nhúng.

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."); 

Có một cách giải quyết cho khác này hơn là không sử dụng chế độ nhúng?

Cảm ơn thời gian của bạn.

Trả lời

4

tôi gặp phải tình huống tương tự khi viết một số xét nghiệm đơn vị. Giải pháp mà James cung cấp đã làm việc; tuy nhiên, nó dẫn đến việc có một đường dẫn mã cho thử nghiệm đơn vị và một đường dẫn khác cho mã sản xuất, đã đánh bại mục đích của phép thử đơn vị. Chúng tôi đã có thể tạo một cửa hàng tài liệu thứ hai và kết nối nó với kho lưu trữ tài liệu đầu tiên cho phép chúng tôi truy cập thành công vào các phương thức mở rộng ủy quyền. Mặc dù giải pháp này có thể sẽ không tốt cho mã sản xuất (vì việc tạo Cửa hàng Tài liệu là tốn kém) nó hoạt động tốt cho các bài kiểm tra đơn vị. Đây là một mẫu mã:

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... 
     } 
    } 
} 

Có vài vật dụng khác cần được nhắc tới:

  1. Các cửa hàng tài liệu đầu tiên cần phải được chạy với UseEmbeddedHttpServer thiết lập là true để cho một thứ hai có thể Truy cập nó.
  2. Tôi đã tạo một hằng số cho Cổng sao cho nó sẽ được sử dụng nhất quán và đảm bảo sử dụng một cổng không được bảo lưu.
3

Tôi cũng gặp điều này. Nhìn vào nguồn, không có cách nào để thực hiện thao tác đó như được viết. Không chắc chắn nếu có một số lý do nội tại sao kể từ khi tôi có thể dễ dàng sao chép các chức năng trong ứng dụng của mình bằng cách thực hiện một yêu cầu http trực tiếp cho các thông tin tương tự:

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(); 
Các vấn đề liên quan