2012-10-30 4 views
50

Ho utilizzato RavenDB-Embedded 2.0.2230 nella mia applicazione interagito con API Web. ASP in diversi assembly.Come posso eseguire correttamente l'esecuzione dell'applicazione RavenDB quando UseEmbeddedHttpServer è impostato su true utilizzando un'architettura a due livelli?

Quando ho impostato UseEmbeddedHttpServer = true nell'archivio documenti, la prima volta che invio una richiesta a RavenDB, viene eseguita correttamente ma quando provo per la seconda volta la mia applicazione visualizza Raven Studio.

Quando rimuovo l'impostazione UseEmbeddedServer, la mia applicazione funziona senza problemi.

mio RavenDB è configurato con i seguenti codici a livello dati:

this.documentStore = new EmbeddableDocumentStore 
{ 
    ConnectionStringName = "RavenDB", 
    UseEmbeddedHttpServer = true 
}.Initialize(); 

e l'implementazione di Web.config hanno queste impostazioni nel livello di servizio:

<connectionStrings> 
    <add name="RavenDB" connectionString="DataDir=~\App_Data\RavenDatabase" /> 
</connectionStrings> 

C'è un'impostazione che ho perso?

C'è qualche impostazione che devo applicare a point Raven Studio su una porta diversa?

+1

@MohsenAlikhani dopo aver istanziato il 'DocumentStore', ma prima di chiamare' Initialize() 'su di esso puoi fare' documentStore.Configuration.Port = ' – GolfWolf

+0

' La proprietà 'Configuration' è sconosciuta per' Raven.Client.IDocumentStore' di RavenDB-Embedded Versione instabile –

+2

Corretto, non è sull'interfaccia 'IDocumentStore' perché è usato anche per non-embedded. È sull'implementazione di 'EmbedddableDocumentStore'. Se stai passando un 'IDocumentStore', basta lanciarlo indietro.'((EmbeddableDocumentStore) mystore) .Configuration.Port = 8080' –

risposta

11

L'unico modo per riprodurre l'esperienza che si descrive è creare intenzionalmente un conflitto di porte. Di default, il server web di RavenDB ospita la porta 8080, quindi se non stai cambiando la porta di Raven, allora devi ospitare la tua applicazione WebApi sulla porta 8080. Se questo non è il caso, per favore fammelo sapere nei commenti, ma assumerò che è così.

Tutto ciò che devi fare per cambiare la porta utilizzata da Raven è modificare il valore della porta prima di chiamare il metodo Initialize.

Aggiungere questo file RavenConfig.cs alla cartella App_Startup:

using Raven.Client; 
using Raven.Client.Embedded; 

namespace <YourNamespace> 
{ 
    public static class RavenConfig 
    { 
     public static IDocumentStore DocumentStore { get; private set; } 

     public static void Register() 
     { 
      var store = new EmbeddableDocumentStore 
         { 
          UseEmbeddedHttpServer = true, 

          DataDirectory = @"~\App_Data\RavenDatabase", 
          // or from connection string if you wish 
         }; 

      // set whatever port you want raven to use 
      store.Configuration.Port = 8079; 

      store.Initialize(); 
      this.DocumentStore = store; 
     } 

     public static void Cleanup() 
     { 
      if (DocumentStore == null) 
       return; 

      DocumentStore.Dispose(); 
      DocumentStore = null; 
     } 
    } 
} 

Poi nel file Global.asax.cs, effettuare le seguenti operazioni:

protected void Application_Start() 
{ 
    // with your other startup registrations 
    RavenConfig.Register(); 
} 

protected void Application_End() 
{ 
    // for a clean shutdown 
    RavenConfig.Cleanup(); 
} 
+1

@MohsenAlikhani Questo ha risolto il problema? In tal caso, contrassegnare questo come risposta. Grazie. –

+0

Grazie per la risposta. –

2

Quando si attiva l'HTTPServer in un EmbeddableDocumentStore RavenDB "dirotta" il webapplication e inizia ad ascoltare sulla stessa porta in cui è in esecuzione l'applicazione.

Oren Eini: Quando si utilizza UseEmbeddedHttpServer da dentro IIS, ci vuole il porto da IIS. È necessario impostare il valore di nuovo

su https://groups.google.com/forum/?fromgroups=#!topic/ravendb/kYVglEoMncw

L'unico modo per evitare che si è o turn-ff il corvo http-server o assegnarlo ad una porta diversa

int ravenPort = 8181; 
NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenPort); 
var ds = new EmbeddableDocumentStore { 
    DataDirectory = [DataFolder],  
    UseEmbeddedHttpServer = true,  
    Configuration = {Port = ravenPort} 
}; 
Problemi correlati