Azure网站上的RavenDb - 拒绝访问

时间:2012-07-17 19:05:24

标签: asp.net-mvc-3 azure ravendb azure-web-sites

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

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

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

Store = EmbeddableDocumentStore { ConnectionStringName = "RavenDb" };

我的连接字符串是:

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

谢谢!

1 个答案:

答案 0 :(得分:12)

当没有为RavenDb指定端口时,它会熄灭并尝试找到它自己的端口,它通过调用 IPGlobalProperties.GetActiveTcpListeners()来实现。

RavenDb | 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>