6

我正在使用 Azure 上的新网站功能,并尝试让 MVC 站点在嵌入式模式下使用 RavenDB 运行。在本地一切正常,但在 azure 中运行部署的站点时出现此错误:

System.Net.NetworkInformation.NetworkInformationException:访问被拒绝

当我在 global.asax 中创建数据库实例时会发生这种情况:

Store = EmbeddableDocumentStore { ConnectionStringName = "RavenDb" };

我的连接字符串是:

<add name="RavenDb" connectionString="DataDir=~\App_Data\Raven" />

谢谢!

4

1 回答 1

12

当没有为 RavenDb 指定端口时,它会出去并尝试找到它自己的,它通过调用IPGlobalProperties.GetActiveTcpListeners()来做到这一点。

乌鸦数据库 | PortUtil.cs

var activeTcpListeners = IPGlobalProperties
                         .GetIPGlobalProperties()
                         .GetActiveTcpListeners();

调用GetActiveTcpListeners()实习生调用 Win32 函数GetTcpTable()尝试枚举主机上所有可能的端口组合。出于显而易见的原因,允许人们在 Windows Azure 网站中进行端口扫描并不是一个好的方案。这意味着GetTcpTable操作失败,当开发世界中的某些事情失败时,我们会抛出异常。

在这种特殊情况下,异常是NetworkInformationException引发的安全权限忽略对GetTcpTable的调用。这就是导致访问被拒绝消息的原因。

tl;博士

将默认端口添加到您的 web.config appsettings 部分:

 <appSettings> 
    <add key="Raven/Port" value="*"/> <!-- Add real tcp port # -->
    <add key="Raven/DataDir" value="~\Data"/> 
    <add key="Raven/AnonymousAccess" value="Get" /> 
 </appSettings> 
于 2012-07-17T22:17:32.633 回答