2012-04-24 15 views
10

मेरे पास एक एएसपी.NET एमवीसी 3 ऐप है जिसे मैंने विकसित किया है जो डेटा के लिए एक एकीकृत बैकिंग स्टोर के रूप में एम्बेडेड RavenDB का उपयोग करता है, मैंने this ट्यूटोरियल का उपयोग RavenDB एंबेडेड के साथ एक एमवीसी ऐप बनाने के लिए आधार के रूप में किया था। मैं अपने विकास पीसी पर ठीक इसे चलाने के लिए कर लिया है, लेकिन जब यह हमारे विंडोज सर्वर 2003 वेब सर्वर चल रहा IIS6 पर तैनात करने के लिए समय आ गया है कि यह निम्न त्रुटि फेंक दिया:RavenDB परिनियोजन समस्या

Cannot access file, the file is locked or in use Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException: Cannot access file, the file is locked or in use

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[EsentFileAccessDeniedException: Cannot access file, the file is locked or in use] Microsoft.Isam.Esent.Interop.Api.Check(Int32 err) in C:\Work\ravendb\SharedLibs\Sources\managedesent-61618\EsentInterop\Api.cs:2736 Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:207

[InvalidOperationException: Could not open transactional storage: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:222 Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration configuration) in c:\Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:185
Raven.Client.Embedded.EmbeddableDocumentStore.InitializeInternal() in c:\Builds\RavenDB-Stable\Raven.Client.Embedded\EmbeddableDocumentStore.cs:143 Raven.Client.Document.DocumentStore.Initialize() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\DocumentStore.cs:496 MyApp.CompositionRoot.CreateControllerFactory() in ...\MyApp\CompositionRoot.cs:36 MyApp.CompositionRoot..ctor() in ..\MyApp\CompositionRoot.cs:17
MyApp.MvcApplication.Application_Start() in ...MyApp\Global.asax.cs:38

[HttpException (0x80004005): Could not open transactional storage: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +3985477
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +325
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): Could not open transactional storage: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11524352 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4782309

में त्रुटि के स्रोत संदर्भित compositionRoot.cs कक्षा तब होती है जब एम्बेड करने योग्य दस्तावेज़ स्टोर की शुरुआत होती है।

private static IControllerFactory CreateControllerFactory() 
{ 
    var cacheRepository = new EmbeddableDocumentStore(); 
    cacheRepository.ConnectionStringName = "RavenDB"; 

    #if DEBUG 
     cacheRepository.UseEmbeddedHttpServer = true; 
    #endif 

    Raven.Database.Server.NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(8080); 
    cacheRepository.Initialize(); //Source of Error 
    var controllerFactory = new TDRControllerFactory(cacheRepository); 
    return controllerFactory; 
} 

यह केवल वेब सर्वर पर क्यों हो रहा है, न कि मेरे विकास पीसी पर? मुझे यकीन नहीं है कि सटीक कारण क्या हो सकता है। किसी भी मदद की सराहना की है।

+0

आईआईएस के तहत चल रही क्लासिक अनुमतियों की तरह लगता है। RavenDB एम्बेडेड से परिचित नहीं है, लेकिन मैं इसे \ webroot के बाहर ले जाउंगा और आईआईएस उपयोगकर्ता प्राइवेट को उस पथ पर दे दूंगा। – kenny

+0

क्या RavenDB पहले से ही सेवा या कमांड लाइन से चल रहा है? – wal

उत्तर

15

यह एक अनुमति समस्या साबित हुई, मैंने आईआईएस_आईयूएसआरएस समूह को मेरे एप्लिकेशन के फ़ोल्डर की जड़ पर अनुमतियां संशोधित और लिख दी और इसने डेटाबेस को ठीक से शुरू करने के लिए आवश्यक अनुमतियां दीं। संभवतः रूट के भीतर एक विशिष्ट फ़ोल्डर है जिसे इसे संशोधित/लिखने की आवश्यकता है (मेरे मामले में, शायद ऐप_Data फ़ोल्डर, क्योंकि वह है जहां मैं RavenDB का अपना उदाहरण तत्काल कर रहा हूं)। मुझे परीक्षण करना होगा क्योंकि मैं नहीं चाहता कि किसी भी उपयोगकर्ता को पूरे एप्लिकेशन फ़ोल्डर में अधिकारों को संशोधित/लिखना पड़े।

4

आपको यह सुनिश्चित करना होगा कि आपका CreateControllerFactory ऐप स्टार्टअप पर समवर्ती अनुरोधों के मुकाबले केवल एक बार चलाएगा।

+0

धन्यवाद Ayende, त्रुटि एक अनुमति मुद्दा बन गया। मैंने आईआईएस_आईयूएसआरएस समूह में अपने आवेदन के रूट फ़ोल्डर को संशोधित और लिखने दिया और जिसने डेटाबेस को ठीक से शुरू करने की अनुमति दी। यदि समस्या कभी भी सामने आती है तो मैं आपके जवाब को भी ध्यान में रखूंगा। रावेनडीबी पर शानदार काम, यह गैर-रिलेशनल डेटाबेस में हमारा पहला उद्यम है, इसलिए हम यह देखने के लिए चिंतित हैं कि यह कैसे काम करता है। – kingrichard2005