2017-08-01 3 views
0
service

je une application Azure (.Net 4.5) et j'ai des fichiers statiques stockés sur le système de fichiers que je veux lire, mais je reçois un System.UnauthorizedAccessException comme siaccès au système de fichiers Azure App

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; 

Je sais que la meilleure pratique est Azure Storage, mais comment puis-je faire en sorte que cela fonctionne de cette façon?

+2

Qu'est-ce que la fin MapPath chemin() jusqu'à être? Vous avez un accès en écriture complète à 'd: \ home \ site \ wwwroot'. (Remarque: tant que vous ne supprimez pas votre application Web, le stockage sous 'site' est durable, tout comme Azure Storage). –

+0

Le chemin de la carte me donne l'emplacement correct (au moins en regardant Kudu), mais il dit un accès invalide –

+1

Pouvez-vous s'il vous plaît modifier votre question avec plus de détails, y compris l'erreur complète, et quel appel génère l'erreur? (Je suppose 'ReadAllText() 'mais je ne sais pas à coup sûr). –

Répondre

2

Comme File.ReadAllText indique au sujet UnauthorizedAccessException, il pourrait être causé par l'une des conditions suivantes:

    chemin
  • spécifié un fichier qui est en lecture seule.

-ou-

  • Cette opération est pris en charge sur la plate-forme actuelle.

-ou-

    chemin
  • spécifié un répertoire.

-ou-

  • L'appelant n'a pas l'autorisation requise.

Vous pouvez tirer parti de la console Kudu et utiliser Attrib commande pour vérifier les attributs de vos fichiers ou répertoires. , Vous pouvez également essayer d'utiliser la commande TYPE pour afficher le contenu de votre fichier ou cliquez sur le bouton Modifier de la table de la liste des fichiers comme suit:

enter image description here

Aussi, je créé une nouvelle application Web et de déployer mon MVC application pour afficher les fichiers sous le dossier App_Data, il pourrait fonctionner comme prévu, vous pouvez vous référer à it.

MISE À JOUR:

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

MAJ2:

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

La seule vraie différence est que je le fais à partir d'une API non MVC, pourriez-vous me montrer l'extrait lit le contenu du fichier? –

+0

J'ai mis à jour ma réponse avec l'extrait de code correspondant. J'ai également vérifié en utilisant 'File.ReadAllText' pour récupérer le contenu de mon fichier json. –

+0

Merci, donc vous n'ouvrez pas réellement le fichier dans Code derrière? –