【问题标题】:Access File system Azure App Service访问文件系统 Azure 应用服务
【发布时间】:2017-08-03 09:42:52
【问题描述】:

我有一个 Azure 应用程序 (.Net 4.5),我有一些静态文件存储在我想从中读取的文件系统上,但我得到一个 System.UnauthorizedAccessException 像这样

string template = string.Empty;
var file = HostingEnvironment.MapPath("~/App_Data/EmailTemplates/" + fileName);
if (!string.IsNullOrEmpty(file))
     {
        template = File.ReadAllText(file); <-- Unauthorized Access Exception Here
     }
return template;

我知道最佳实践是 Azure 存储,但我该如何以这种方式工作?

【问题讨论】:

  • MapPath() 路径最终是什么?您拥有对d:\home\site\wwwroot 的完全写入权限。 (注意:只要你不删除你的 web 应用,site 下的存储是持久的,就像 Azure 存储一样)。
  • 地图路径为我提供了正确的位置(至少在 Kudu 中查看),但它显示无效访问
  • 您能否更详细地编辑您的问题,包括完整的错误,以及哪个调用产生了错误? (我假设ReadAllText() 但不确定)。
  • 我无法访问完整错误,因为它使用的是 Release Build,我只有异常类型和路径

标签: c# azure azure-web-app-service


【解决方案1】:

正如File.ReadAllText 所说的UnauthorizedAccessException,它可能是由以下情况之一引起的:

  • path 指定了一个只读文件。

-或-

  • 当前平台不支持此操作。

-或-

  • path 指定了一个目录。

-或-

  • 调用者没有所需的权限。

您可以利用 kudu 控制台并使用 Attrib 命令检查文件或目录的属性。此外,您可以尝试使用TYPE 命令来显示您的文件的内容或单击文件列表中的编辑按钮,如下所示:

另外,我创建了一个新的 web 应用程序并部署了我的 MVC 应用程序来显示 App_Data 文件夹下的文件,它可以按预期工作,您可以参考 it。

更新:

//method for getting files
public List<DownLoadFileInformation> GetFiles()
{
    List<DownLoadFileInformation> lstFiles = new List<DownLoadFileInformation>();
    DirectoryInfo dirInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/App_Data"));

    int i = 0;
    foreach (var item in dirInfo.GetFiles())
    {
        lstFiles.Add(new DownLoadFileInformation()
        {

            FileId = i + 1,
            FileName = item.Name,
            FilePath = dirInfo.FullName + @"\" + item.Name
        });
        i = i + 1;
    }
    return lstFiles;
}

//action for downloading a file
public ActionResult Download(string FileID)
{
    int CurrentFileID = Convert.ToInt32(FileID);
    var filesCol = obj.GetFiles();
    string fullFilePath = (from fls in filesCol
                                where fls.FileId == CurrentFileID
                                select fls.FilePath).First();

    string contentType = MimeMapping.GetMimeMapping(fullFilePath);
    return File(fullFilePath, contentType, new FileInfo(fullFilePath).Name);
}

更新 2:

public ActionResult ViewOnline(string FileID)
{
    int CurrentFileID = Convert.ToInt32(FileID);
    var filesCol = obj.GetFiles();
    string fullFilePath = (from fls in filesCol
                                where fls.FileId == CurrentFileID
                                select fls.FilePath).First();
    string text = System.IO.File.ReadAllText(fullFilePath);
    return Content(text);
}

【讨论】:

  • 唯一真正的区别是我是从 API 而不是 MVC 执行此操作的,你能告诉我读取文件内容的 sn-p 吗?
  • 我用相关代码 sn-p 更新了我的答案。我还检查了使用 File.ReadAllText 检索我的 json 文件的内容。
  • 谢谢,所以您实际上并没有在 Code behind 中打开文件?
  • 我更新了我的答案并添加了ViewOnline 操作。您可以查看文件列表并单击View online 按钮。
猜你喜欢
  • 2016-06-11
  • 2017-09-06
  • 2019-01-23
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多