Partager via


Vous recevez une erreur System.IO.FileNotFoundException lorsque l’application cliente appelle un service web

Cet article vous aide à résoudre le problème qui System.IO.FileNotFoundException se produit lorsqu’une application web ASP.NET appelle un service web.

Version du produit d’origine : ASP.NET
Numéro de base de connaissances d’origine : 823196

Symptômes

Lorsque vous appelez un service web dans une application web ASP.NET, vous pouvez recevoir l’erreur suivante :

System.IO.FileNotFoundException

Cause

Vous pouvez recevoir l’erreur si l’une des conditions suivantes est remplie :

  • Le processus de travail n’a pas les autorisations nécessaires pour lire le répertoire Temp du processus et le processus worker n’a pas les autorisations d’écriture dans le répertoire Temp du processus.

    Note

    La XmlSerializer classe génère et compile du code à la volée pour effectuer la sérialisation et la désérialisation. XmlSerializer utilise code Document Object Model (CodeDom) pour effectuer la compilation. La compilation CodeDom utilise des fichiers temporaires sur un disque. Si le processus de travail n’a pas les autorisations de lecture sur le répertoire Temp et les autorisations d’écriture sur le répertoire Temp, tous les appels au service Web échouent. Par conséquent, le processus de travail nécessite les autorisations de lecture sur le répertoire Temp et les autorisations d’écriture sur le répertoire Temp.

  • Il existe des erreurs de compilation dans le code généré XmlSerializer .

Résolution 1 : Attribuer des autorisations au compte de processus de travail sur le répertoire Temp

Pour résoudre ce problème, le compte de processus de travail ASP.NET (le compte ASPNET ou le compte NETWORK SERVICE si votre application est déployée sur Internet Information Services (IIS) 6.0) doit disposer d’un accès en lecture et d’un accès en écriture sur le répertoire Temp.

Note

Si vous utilisez l’emprunt d’identité, l’utilisateur emprunt d’identité doit avoir un accès complet sur le répertoire Temp.

Pour attribuer des autorisations requises au compte de processus de travail sur le répertoire Temp, procédez comme suit :

  1. Dans l’Explorateur Windows, recherchez le %windir%\temp directoryfichier .

  2. Cliquez avec le bouton %windir%\tempdroit, puis sélectionnez Propriétés.

  3. Dans la fenêtre Propriétés , sélectionnez l’onglet Sécurité .

  4. Sélectionnez Ajouter, tapez ServerName\ASPNET, puis sélectionnez OK.

    Note

    Remplacez ServerName par le nom du serveur web.

    Remplacez ASPNET par NETWORK SERVICE si vous avez déployé votre application sur IIS 6.0.

  5. Sous Autoriser, activez la case à cocher Contrôle total, puis sélectionnez OK.

Résolution 2 : Rechercher les erreurs du compilateur dans le code généré par XmlSerializer

Pour rechercher des erreurs générées par le compilateur, vous devez ajouter un commutateur au fichier Web.config pour conserver les fichiers générés par le compilateur. Pour ce faire, procédez comme suit :

  1. Ouvrez le fichier Web.config dans un éditeur de texte, tel que le Bloc-notes.

  2. Ajoutez un XmlSerialization.Compilation commutateur à la <system.diagnostics> section du code, comme suit :

    <configuration>
        <system.diagnostics>
            <switches>
                <add name="XmlSerialization.Compilation" value="4"/>
            </switches>
        </system.diagnostics>
    </configuration>
    
  3. Exécuter l’application cliente.

    L’application cliente appelle le service web.

  4. Vérifiez que le %windir%\temp répertoire contient le fichier _tmpname.00.cs et le fichier _tmpname.out .

    Le fichier _tmpname.00.cs est la source générée. Le fichier _tmpname.out doit contenir les erreurs du compilateur.

    Note

    Activez les autorisations de lecture et activez les autorisations d’écriture dans le compte de processus de travail (ASPNET ou SERVICE RÉSEAU) pour écrire %tmpname% des fichiers dans le répertoire Temp.

État

Ce comportement est normal.

Étapes à suivre pour reproduire le comportement

Les sections suivantes fournissent des informations sur les étapes à suivre pour reproduire le comportement.

Créer un service web

  1. Démarrez Visual Studio .NET.

  2. Créez un projet de service web ASP.NET à l’aide de Visual C# .NET ou visual Basic .NET.

    Par défaut, Service1.asmx est créé.

  3. Nommez le projet WebServiceTemp.

  4. Dans Explorateur de solutions, cliquez avec le bouton droit sur Service1.asmx, puis sélectionnez Afficher le code.

  5. Dans le fichier Service1.asmx.cs (ou le fichier Service1.asmx.vb si vous utilisez Visual Basic .NET), supprimez les marques de commentaire de la méthode web par défaut HelloWorld() .

  6. Dans le menu Générer, sélectionnez Générer la solution.

Créer une application web cliente

  1. Créez une application web ASP.NET à l’aide de Visual C# .NET ou visual Basic .NET.

  2. Nommez le projet WebAppTemp.

  3. Dans Explorateur de solutions, cliquez avec le bouton droit sur Références, puis sélectionnez Ajouter une référence web.

  4. Dans la zone de texte Adresse , tapez l’URL suivante pour WebServiceTemp :
    http://localhost/WebServiceTemp/Service1.asmx

  5. Sélectionnez Go, puis ajoutez une référence.

  6. Double-cliquez sur WebForm1 pour ouvrir le code d’événement Page_Load .

  7. Ajoutez le code suivant au gestionnaire d’événements Page_Load .

    • Exemple de code .NET Visual C#

      // Start an instance of the Web service client-side proxy.
      localhost.Service1 myProxy = new localhost.Service1();
      Response.Write( myProxy.HelloWorld());
      
    • Exemple de code .NET Visual Basic

      'Start an instance of the Web service client-side proxy.
      Dim myProxy As localhost.Service1 = New localhost.Service1()
      Response.Write(myProxy.HelloWorld())
      
  8. Dans le menu Générer, sélectionnez Générer la solution.

Définir des autorisations sur le répertoire Temp

Pour attribuer des autorisations requises au compte de processus de travail sur le répertoire Temp, procédez comme suit :

  1. Dans l’Explorateur Windows, recherchez le %windir% répertoire.

  2. Cliquez avec le bouton %windir%\tempdroit, puis sélectionnez Propriétés.

  3. Dans la fenêtre Propriétés , sélectionnez l’onglet Sécurité .

  4. Sélectionnez Ajouter, tapez ServerName\ASPNET, puis sélectionnez OK.

  5. Vérifiez que la case à cocher Écrire n’est pas cochée sous Autoriser, puis sélectionnez OK.

  6. Exécutez l’application web.

    Vous pouvez recevoir l’erreur mentionnée dans la section Symptômes de cet article.