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 :
Dans Windows Explorer, recherchez .
%windir%\temp directory
Cliquez avec le bouton droit sur
%windir%\temp
, puis sélectionnez Propriétés.Dans la fenêtre Propriétés , sélectionnez l’onglet Sécurité .
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.
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 :
Ouvrez le fichier Web.config dans un éditeur de texte, tel que le Bloc-notes.
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>
Exécutez l’application cliente.
L’application cliente appelle le service web.
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
Démarrez Visual Studio .NET.
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éé.
Nommez le projet WebServiceTemp.
Dans Explorateur de solutions, cliquez avec le bouton droit sur Service1.asmx, puis sélectionnez Afficher le code.
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()
.Dans le menu Générer, sélectionnez Générer la solution.
Créer une application web cliente
Créez une application web ASP.NET en utilisant Visual C# .NET ou Visual Basic .NET.
Nommez le projet WebAppTemp.
Dans Explorateur de solutions, cliquez avec le bouton droit sur Références, puis sélectionnez Ajouter une référence web.
Dans la zone de texte Adresse , tapez l’URL suivante pour WebServiceTemp :
http://localhost/WebServiceTemp/Service1.asmx
Sélectionnez Go, puis Ajouter une référence.
Double-cliquez sur WebForm1 pour ouvrir le code de l’événement
Page_Load
.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())
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 :
Dans Windows Explorer, recherchez le
%windir%
répertoire .Cliquez avec le bouton droit sur
%windir%\temp
, puis sélectionnez Propriétés.Dans la fenêtre Propriétés , sélectionnez l’onglet Sécurité .
Sélectionnez Ajouter, tapez ServerName\ASPNET, puis sélectionnez OK.
Vérifiez que la zone Écrire case activée n’est pas cochée sous Autoriser, puis sélectionnez OK.
Exécutez l’application web.
Vous pouvez recevoir l’erreur mentionnée dans la section Symptômes de cet article.