2017-05-12 2 views
2

J'ai une méthode MVC comme ceci:MVC: File.exists return false

public ActionResult DownloadDocument(string filePath){ 
    //Other stuff 
    if (!System.IO.File.Exists(filePath)) 
    { 
     FileLogger.Debug($"DownloadDocument : {filePath} NotFound"); 
    } 
    //Other stuff 
} 

filePath ressemble =>\\ServerB\Documents\General\Administration\Doc1.pdf

Je Dans une IISExpress locale (je sais que ce n'est pas grande, mais pas d'autre choix ...) et un serveur de données (serveur B). Le fichier est sur le serveur B. Cela fonctionne vraiment bien, je peux récupérer mon fichier.

Lors de la publication, j'ai un IIS sur le serveur A et le même serveur de données (serveur B). FilePath est encore sur le serveur B. Dans ce cas, je ne peux pas récupérer mon dossier parce que cette ligne retourne Faux:

System.IO.File.Exists(filePath) 

recherche d'une solution, je vois ServerMapPath mais ce n'est pas aider parce que filePath est sur le serveur B, pas le serveur A.

Lorsque je me connecte au serveur A, si dans l'explorateur de fichiers je mets le lien \\ServerB\Documents\General\Administration\Doc1.pdf, le fichier est récupéré correctement.

Peut-être qu'il ya un problème de sécurité, mais ne savent pas où chercher ...

Merci pour votre aide

+0

Il se peut que l'utilisateur IIS n'ait pas accès au chemin donné. –

+0

vous voulez dire que vous voulez accéder à un fichier du serveur B avec l'application déployée sur le serveur A? –

+1

IISExpress s'exécute sous * vos * informations d'identification et * vous * avez accès à ServerB. IIS s'exécute sous un compte de service, qui n'a apparemment pas accès. –

Répondre

3

Ceci est probablement un problème de droits d'accès. Le dossier existe, mais .NET ne peut pas le déterminer car l'utilisateur IIS n'a pas accès au partage réseau.

Vous pouvez vérifier cela en exécutant le pool d'applications IIS en tant qu'utilisateur réseau, par exemple votre propre compte. Ne le faites pas dans des scénarios de production! Créez un compte de domaine distinct pour l'utilisateur IIS.

+0

Je suis d'accord avec vous. "Ne faites pas cela dans les scénarios de production! Créer un compte de domaine distinct pour l'utilisateur IIS." –

1

Essayez de créer un pool d'applications qui peuvent accéder au fichier à partir du serveur B.

Right-Click Application Pool > Advanced Settings 

enter image description here

Aller dans le processus modèle Section> Identité> Cliquez ApplicationPoolIdentity

De Compte intégré . Sélectionnez> Compte personnalisé:> Cick Set>

Définir les informations d'identification s'affichera. enter image description here

Définissez vos informations d'identification et attribuer le pool d'applications à votre application sur le serveur A.

Assurez-vous que les informations d'identification de l'utilisateur a accès au serveur de fichiers B.

Espérons que cela aidera.