Windows Azure云服务-拒绝访问已部署的xml文件

本文关键字:部署 xml 文件 拒绝访问 Azure 服务 Windows | 更新日期: 2023-09-27 18:10:45

我有一个MVC应用程序运行良好的前提,它运行良好的azure网站。但是当作为云服务部署时,我在访问某些xml文件时遇到了访问拒绝问题。

这些xml文件只是应用程序所需的数据位,可以帮助确定应用程序中的某些设置。

在分层文件夹结构下有大量这样的设置,因为其思想是对每个设置进行处理以允许在应用程序中继承我需要的设置。但无论如何,这在很大程度上是无关紧要的,因为在一天结束时,这些只是存储在web根目录下的一个文件夹中的xml文件。

xml文件的构建操作属性被设置为内容,这样它们就可以通过发布进行部署。事实上,我已经RDP到云服务VM上,只是为了检查xml文件是否被部署,并可以确认它们是。

然而,每当应用程序试图读取这些文件之一,我得到以下访问拒绝错误。

访问路径"E:'sitesroot'0'Templates'Applications'ControlProperties.xml"被拒绝。

(注意:这不是下面答案所假设的硬编码路径,我使用HttpContext.Current.Server.MapPath来确定相对于web根文件的物理路径)

这只是一个标准的访问拒绝错误,表示应用程序没有读取文件的权限。

现在,如果我再次RDP到机器,并授予每个人对这个特定文件的完全访问权(只是为了诊断目的!),那么应用程序就可以正常工作,而不会抛出错误。因此,这证明了它确实是一个访问问题。

问题是,这些只是与项目一起部署的简单xml文件,我真的不想在每个部署上设置文件权限。这是错误的。

所以我试图理解为什么作为标准部署的一部分,云服务无法读取这些部署的xml文件,然后我对一个适当的解决方案感兴趣。例如,一些权限设置可能会与解决方案一起部署,或者可能有一个更好的替代方法来解决这个问题。

就我用来读取xml文件的代码而言,我只是使用XmlSerializer将文件的内容反序列化回对象。(如下)

 public static T Deserialise(string settingsFile)
    {
        using (var fs = new FileStream(settingsFile, FileMode.Open))
        {
            var sr = new XmlSerializer(typeof (T));
            var obj = (T) sr.Deserialize(fs);
            fs.Close();
            return obj;
        }
    }

我知道有本地存储的web角色,这将是很好的我使用,如果我想能够读取和写入存储作为我的应用程序的一部分。但本质上,这些都是需要与应用程序一起部署的配置设置文件。

Windows Azure云服务-拒绝访问已部署的xml文件

最后发现问题出在文件访问方法上。我最初使用Filestream来打开文件的内容,即使在更高的角色权限下运行,我也会得到这个访问拒绝错误。

然而,将代码更改为先将文件内容读取为字符串,我能够避免此错误。

    public static T Deserialise(string settingsFile)
    {
        var fileContents = File.ReadAllText(settingsFile);
        using (var fs = new MemoryStream(Encoding.ASCII.GetBytes(fileContents)))
        {
            var sr = new XmlSerializer(typeof (T));
            var obj = (T) sr.Deserialize(fs);
            fs.Close();
            return obj;
        }
    }

不确定为什么Filestream方法需要这些额外的权限,但是上面的解决方案在这种情况下对我有效。

项目本身,您可以添加文件夹和映射文件路径在您的web。将E:'sitesroot'0'Templates'Applications'ControlProperties.xml替换为config。因此,访问权限问题将自动避免当你的托管在云服务。

我已经做了如下,

在web . config中

:

<configuration>
        <appSettings>
             <add key="DocsPath" value="http://somesitename.cloudapp.net/Files/"/>
        </appSettings>
  <connectionStrings>

In Code Behind:

string Location = ConfigurationManager.AppSettings["DocsPath"] + "ChildFolderName" + "''" + Filename.XML;

在云URL中,这将不会给出任何访问权限错误。以这种方式织网。配置你也可以做调试。你只需要像我在web.config中提到的那样指向路径。在web.config中更改连接字符串和其他东西。

区别在于文件访问方式。事实证明,您无法在Azure Web/Worker角色中打开文件进行写入。即使你只是从文件中读取文件。Open以读/写权限打开它们。所以这应该也可以工作:

using (var stream = File.Open(settingsFile, FileMode.Open, FileAccess.Read))
{
...
}

我猜这背后的全部原因是,在某些问题的情况下,Azure自动重新部署你的角色使用最初上传的包。在这种情况下,以前对文件所做的任何修改都将丢失,并被包中的原始文件所取代。