2012-10-11 8 views
5

में समर्थित नहीं है RavenDB InvalidOperationException फेंकता है जब IsOperationAllowedOnDocument एम्बेडेड मोड का उपयोग करके कॉल किया जाता है।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

मैं एक ही स्थिति का सामना करना पड़ा, जबकि कुछ इकाई परीक्षण लेखन। समाधान जेम्स ने काम किया; हालांकि, इसके परिणामस्वरूप इकाई परीक्षण के लिए एक कोड पथ और उत्पादन कोड के लिए एक और पथ था, जिसने इकाई परीक्षण के उद्देश्य को हरा दिया। हम एक दूसरा दस्तावेज़ स्टोर बनाने और इसे पहले दस्तावेज़ स्टोर से कनेक्ट करने में सक्षम थे, जिसने हमें प्राधिकरण एक्सटेंशन विधियों को सफलतापूर्वक एक्सेस करने की अनुमति दी। हालांकि यह समाधान शायद उत्पादन कोड के लिए अच्छा नहीं होगा (क्योंकि दस्तावेज़ स्टोर बनाना महंगा है) यह यूनिट परीक्षणों के लिए अच्छी तरह से काम करता है। यहाँ एक कोड नमूना है:

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. पहला दस्तावेज दुकान 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();