访问文件系统Azure App Service

时间:2017-08-01 21:09:19

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

我有一个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存储,但我如何以这种方式工作呢?

1 个答案:

答案 0 :(得分:2)

由于File.ReadAllText表示UnauthorizedAccessException,可能是由以下某种情况引起的:

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

-OR -

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

-OR -

     
      
  • path指定了一个目录。
  •   
     

-OR -

     
      
  • 来电者没有所需的权限。
  •   

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

enter image description here

此外,我创建了一个新的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);
}

<强> UPDATE2:

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);
}