Windows Azure Environment.GetEnvironmentVariable(“RoleRoot”)读取访问被拒绝错误

时间:2011-04-28 17:45:10

标签: azure

我有一个我试图从

中读取的xml文件
string xmlTemplatePath = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") + @"\", @"approot\myxml.xml");

使用XDocument doc = XDocument.Load(xmlTemplatePath),但是我在云和开发环境中都获得了访问被拒绝的异常。有没有为什么读取被拒绝的想法?

2 个答案:

答案 0 :(得分:1)

我知道,旧线程......但答案对某人有用。

看来,azure工作进程在自定义用户下运行(在taskmgr中显示为GUID)。此用户帐户似乎非常受限制,并且对文件系统没有读取权限(即使在approot目录中也是如此)。

我的解决方案是为azure角色创建一个启动脚本(请参阅msdn article),该脚本使用icacls添加访问文件的权限。在这种情况下,我在项目中创建了一个名为startup \ Install.cmd的文件,其中包含以下内容:

@echo off

if "%EMULATED%"=="true" goto :EOF

echo Allowing access to files
cd directory_where_files_exist
icacls *.* /grant Everyone:F

在我的ServiceDefinition.csdef文件中,我指示Azure部署系统在部署期间运行此启动脚本,方法是将其置于角色定义中(例如< WorkerRole>):

<Startup>
  <Task executionContext="elevated" commandLine="startup\Install.cmd">
    <Environment>
      <Variable name="EMULATED">
        <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
      </Variable>
    </Environment>
  </Task>
</Startup>

模拟器运行时设置变量“EMULATED” - 请注意,在上面的startup / Install.cmd文件中,如果在模拟器中运行,我会跳过进行权限更改。

答案 1 :(得分:0)

对我来说很好看。在我的项目根目录中创建myxml.xml之后,我甚至抓住你的代码并将其放入一个辅助角色,从OnStart()调用它,只是为了确保我没有遗漏任何明显的东西。

检查myxml.xml属性:“Build Action”应为“Content”,“Copy to Output Directory”应为“Copy always”或“Copy if newer”。如果这不能解决问题,请检查该文件的权限。