我有一个我试图从
中读取的xml文件string xmlTemplatePath = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") + @"\", @"approot\myxml.xml");
使用XDocument doc = XDocument.Load(xmlTemplatePath)
,但是我在云和开发环境中都获得了访问被拒绝的异常。有没有为什么读取被拒绝的想法?
答案 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”。如果这不能解决问题,请检查该文件的权限。