当使用 2 层架构将 UseEmbeddedHttpServer 设置为 true 时,如何使我的 RavenDB 应用程序正确执行?

Posted

技术标签:

【中文标题】当使用 2 层架构将 UseEmbeddedHttpServer 设置为 true 时,如何使我的 RavenDB 应用程序正确执行?【英文标题】:How could I make my RavenDB application execute properly when UseEmbeddedHttpServer is set to true using 2-tier architecture? 【发布时间】:2012-10-30 20:26:55 【问题描述】:

我在我的应用程序中使用 RavenDB-Embedded 2.0.2230 与不同程序集中的 ASP .Net Web API 进行交互。

当我在文档存储中设置UseEmbeddedHttpServer = true 时,我第一次向 RavenDB 发送请求时,它可以正常执行,但是当我第二次尝试时,我的应用程序会显示 Raven Studio。

当我删除UseEmbeddedServer 设置时,我的应用程序运行没有任何问题。

我的 RavenDB 在数据层配置了以下代码:

this.documentStore = new EmbeddableDocumentStore

    ConnectionStringName = "RavenDB",
    UseEmbeddedHttpServer = true
.Initialize();

Web.config 的实现在服务层中有这些设置:

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

有没有我错过的设置?

是否需要应用任何设置才能将 Raven Studio 指向不同的端口?

【问题讨论】:

@MohsenAlikhani 在您实例化DocumentStore 之后,但在您调用Initialize() 之前,您可以执行documentStore.Configuration.Port = &lt;port value&gt; Configuration 属性对于 RavenDB-Embedded Unstable 版本的 Raven.Client.IDocumentStore 未知。 正确,它不在IDocumentStore 接口上,因为它也用于非嵌入式。它在EmbedddableDocumentStore 实现上。如果您传递的是IDocumentStore,只需将其投回即可。 ((EmbeddableDocumentStore)mystore).Configuration.Port = 8080 我认为您可以通过更改服务器的配置选项使其在另一个主机上工作:端口组合,检查Here 并查找 Http 设置。 在 ravendb 谷歌群组列表中提问:groups.google.com/forum/?fromgroups#!forum/ravendb 【参考方案1】:

我可以重现您描述的体验的唯一方法是故意制造端口冲突。默认情况下,RavenDB 的 Web 服务器托管在端口 8080 上,因此如果您不更改 raven 的端口,那么您必须在端口 8080 上托管您的 WebApi 应用程序。如果不是这种情况,请在 cmets 中告诉我,但我会假设原来如此。

要更改 Raven 使用的端口,您只需在调用 Initialize 方法之前修改端口值即可。

将此RavenConfig.cs 文件添加到您的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;
        
    

然后在您的Global.asax.cs 文件中,执行以下操作:

protected void Application_Start()

    // with your other startup registrations
    RavenConfig.Register();


protected void Application_End()

    // for a clean shutdown
    RavenConfig.Cleanup();

【讨论】:

@MohsenAlikhani 这解决了问题吗?如果是这样,请将其标记为答案。谢谢。【参考方案2】:

当您在 EmbeddableDocumentStore 中启用 HttpServer 时,ravenDB 会“劫持”网络应用程序并开始侦听应用程序正在运行的同一端口。

奥伦·艾尼: 当您从 IIS 内部使用 UseEmbeddedHttpServer 时,它会占用端口 来自 IIS。您需要重新设置该值

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

防止它的唯一方法是关闭 raven http-server 或将其分配给不同的端口

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

【讨论】:

以上是关于当使用 2 层架构将 UseEmbeddedHttpServer 设置为 true 时,如何使我的 RavenDB 应用程序正确执行?的主要内容,如果未能解决你的问题,请参考以下文章

C#(VS2019):当两者都使用使用 VS 项目结构的类时,如何将域层与数据层分离

VIPER 架构

三层架构简单配置实验(使用了SVIVRRPSTPETH-TRUNKOSPF等),模仿内网访问外网

JavaEE使用三层架构(显示层业务逻辑层数据访问层)实现数据的增删改查

JAVA的三层架构是啥样的?

三层架构和mvc模式有啥关系