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 d’origine du produit : ASP.NET
Numéro de la 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 dans le répertoire temp du processus, et le processus de travail n’a pas les autorisations nécessaires pour écrire dans le répertoire temporaire du processus.

    Remarque

    La XmlSerializer classe génère et compile le code à la volée pour effectuer la sérialisation et la désérialisation. XmlSerializer utilise CodeDom (Code Document Object Model) pour effectuer la compilation. La compilation CodeDom utilise des fichiers temporaires sur un disque. Si le processus de travail ne dispose pas des autorisations de lecture sur le répertoire Temp et des 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 SERVICE RÉSEAU si votre application est déployée sur Internet Information Services (IIS) 6.0) doit disposer d’un accès en lecture et en écriture sur le répertoire Temp.

Remarque

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

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

  1. Dans Windows Explorer, recherchez .%windir%\temp directory

  2. Cliquez avec le bouton droit sur %windir%\temp, 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.

    Remarque

    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, sélectionnez la zone Contrôle total case activée, puis sélectionnez OK.

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

Pour rechercher les erreurs générées par le compilateur, vous devez ajouter un commutateur au fichier Web.config afin de conserver les fichiers générés par le compilateur. Pour cela, 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écutez 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.

    Remarque

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

Statut

Ce comportement est inhérent au produit.

Procédures pour reproduire le problème

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 en utilisant 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 en utilisant 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 Ajouter une référence.

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

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

    • Exemple de code Visual C# .NET

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

      '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 les autorisations requises au compte de processus de travail sur le répertoire Temp, procédez comme suit :

  1. Dans Windows Explorer, recherchez le %windir% répertoire .

  2. Cliquez avec le bouton droit sur %windir%\temp, 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 zone Écrire case activée 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.