2012-10-11 8 views
5

RavenDB wyrzuca InvalidOperationException, gdy IsOperationAllowedOnDocument jest wywoływany za pomocą trybu wbudowanego.RavenDB IsOperationAllowedOnDocument nieobsługiwany w trybie wbudowanym

Widzę w implementacji IsOperationAllowedOnDocument implementację klauzuli sprawdzającej dla wywołań w trybie osadzonym.

Czy istnieje obejście tego problemu, zamiast nie używać trybu wbudowanego?

Dzięki za poświęcony czas.

Odpowiedz

4

ja spotkałem tę samą sytuację pisząc kilka testów jednostkowych. Rozwiązanie dostarczone przez Jamesa zadziałało; jednakże skutkowało to jedną ścieżką kodową dla testu jednostkowego i inną ścieżką dla kodu produkcyjnego, która pokonała cel testu jednostkowego. Udało nam się utworzyć drugi magazyn dokumentów i połączyć go z pierwszym magazynem dokumentów, co pozwoliło nam pomyślnie uzyskać dostęp do metod autoryzacji rozszerzeń. Chociaż to rozwiązanie prawdopodobnie nie byłoby dobre dla kodu produkcyjnego (ponieważ tworzenie magazynów dokumentów jest drogie), to działa dobrze dla testów jednostkowych. Oto przykładowy kod:

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

Istnieje kilka innych elementów, które należy wymienić:

  1. Pierwszy sklep dokument musi być prowadzony z UseEmbeddedHttpServer ustawiony na true, tak aby druga puszka Uzyskać dostęp do niego.
  2. Stworzyłem stałą dla portu, aby była używana konsekwentnie i zapewniać użycie niezarezerwowanego portu.
3

Napotkałem to również. Patrząc na źródło, nie można zrobić tej operacji tak, jak napisano. Nie wiem, czy istnieje jakiś istotny powód, skoro mogę łatwo replikować funkcjonalność w mojej aplikacji poprzez żądanie HTTP bezpośrednio do tej samej informacji:

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