Wenn die Clientanwendung einen Webdienst aufruft, wird ein System.IO.FileNotFoundException-Fehler angezeigt.
Dieser Artikel hilft Ihnen, das Problem zu beheben, das System.IO.FileNotFoundException auftritt, wenn eine ASP.NET Webanwendung einen Webdienst aufruft.
Ursprüngliche Produktversion: ASP.NET
Ursprüngliche KB-Nummer: 823196
Problembeschreibung
Wenn Sie einen Webdienst in einer ASP.NET Webanwendung aufrufen, wird möglicherweise der folgende Fehler angezeigt:
System.IO.FileNotFoundException
Ursache
Möglicherweise wird der Fehler angezeigt, wenn eine der folgenden Bedingungen zutrifft:
Der Arbeitsprozess verfügt nicht über die Berechtigung, in das Verzeichnis "Temp" des Prozesses zu lesen, und der Arbeitsprozess verfügt nicht über die Berechtigung, in das Verzeichnis "Temp" des Prozesses zu schreiben.
Hinweis
Die
XmlSerializerKlasse generiert und kompiliert Code im laufenden Betrieb, um die Serialisierung und Deserialisierung durchzuführen.XmlSerializerverwendet Code Document Object Model (CodeDom) zum Ausführen der Kompilierung. Die CodeDom-Kompilierung verwendet temporäre Dateien auf einem Datenträger. Wenn der Arbeitsprozess nicht über die Leseberechtigungen für das Verzeichnis Temp und die Schreibberechtigungen für das Verzeichnis Temp verfügt, schlagen alle Aufrufe an den Webdienst fehl. Daher erfordert der Arbeitsprozess die Leseberechtigungen für das Verzeichnis Temp und die Schreibberechtigungen für das Verzeichnis Temp.Der generierte Code enthält Kompilierungsfehler.
XmlSerializer
Auflösung 1: Zuweisen von Berechtigungen zum Arbeitsprozesskonto im Verzeichnis Temp
Um dieses Problem zu beheben, muss das ASP.NET-Arbeitsprozesskonto (das ASPNET-Konto oder das NETZWERKDIENSTkonto, wenn Ihre Anwendung auf Internetinformationsdienste (IIS) 6.0) bereitgestellt wird, über Lese- und Schreibzugriff im Verzeichnis Temp verfügen.
Hinweis
Wenn Sie den Identitätswechsel verwenden, muss der imitierte Benutzer voll auf das Verzeichnis Temp zugreifen können.
Führen Sie die folgenden Schritte aus, um dem Arbeitsprozesskonto im Verzeichnis Temp die erforderlichen Berechtigungen zuzuweisen:
Suchen Sie in Windows Explorer nach der
%windir%\temp directory.Klicken Sie mit der rechten
%windir%\tempMaustaste, und wählen Sie dann Eigenschaften aus.Wählen Sie im Eigenschaftenfenster die Registerkarte "Sicherheit" aus.
Wählen Sie "Hinzufügen", geben Sie "ServerName\ASPNET" ein, und wählen Sie dann "OK" aus.
Hinweis
Ersetzen Sie ServerName durch den Namen des Webservers.
Ersetzen Sie ASPNET durch NETWORK SERVICE, wenn Sie Ihre Anwendung in IIS 6.0 bereitgestellt haben.
Aktivieren Sie unter "Zulassen" das Kontrollkästchen "Vollzugriff", und klicken Sie dann auf "OK".
Lösung 2: Suchen von Compilerfehlern im Code, der von XmlSerializer generiert wurde
Um Fehler zu finden, die vom Compiler generiert werden, müssen Sie der Web.config Datei einen Schalter hinzufügen, um vom Compiler generierte Dateien beizubehalten. Gehen Sie dazu wie folgt vor:
Öffnen Sie dieWeb.config-Datei in einem Text-Editor, z. B. Editor.
Fügen Sie dem Codeabschnitt wie folgt einen
XmlSerialization.CompilationSchalter<system.diagnostics>hinzu:<configuration> <system.diagnostics> <switches> <add name="XmlSerialization.Compilation" value="4"/> </switches> </system.diagnostics> </configuration>Führen Sie die Clientanwendung aus.
Die Clientanwendung ruft den Webdienst auf.
Stellen Sie sicher, dass das
%windir%\tempVerzeichnis über die Datei _tmpname.00.cs und die Datei _tmpname.out verfügt.Die Datei _tmpname.00.cs ist die generierte Quelle. Die Datei _tmpname.out sollte die Compilerfehler aufweisen.
Hinweis
Aktivieren Sie die Leseberechtigungen und aktivieren Sie die Schreibberechtigungen für das Arbeitsprozesskonto (ASPNET oder NETWORK SERVICE), um Dateien im Verzeichnis Temp zu
%tmpname%schreiben.
Status
Es handelt sich hierbei um ein beabsichtigtes Verhalten.
Schritte zum Reproduzieren des Verhaltens
In den folgenden Abschnitten finden Sie Informationen zu den Schritten zum Reproduzieren des Verhaltens.
Erstellen eines Webdiensts
Starten Sie Visual Studio .NET.
Erstellen Sie ein neues ASP.NET Webdienstprojekt mit Visual C# .NET oder Visual Basic .NET.
Standardmäßig wird "Service1.asmx" erstellt.
Geben Sie dem Projekt den Namen WebServiceTemp.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf "Service1.asmx", und wählen Sie dann Code anzeigen aus.
Heben Sie in der Datei "Service1.asmx.cs" (oder in der Datei "Service1.asmx.vb", wenn Sie Visual Basic .NET verwenden) die Auskommentierung der
HelloWorld()Standardwebmethode auf.Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen einer Clientwebanwendung
Erstellen Sie eine neue ASP.NET Webanwendung mit Visual C# .NET oder Visual Basic .NET.
Geben Sie dem Projekt den Namen WebAppTemp.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Verweise, und wählen Sie dann Webverweis hinzufügen aus.
Geben Sie im Textfeld "Adresse" die folgende URL für WebServiceTemp ein:
http://localhost/WebServiceTemp/Service1.asmxWählen Sie "Wechseln" und dann "Verweis hinzufügen" aus.
Doppelklicken Sie auf WebForm1, um den Ereigniscode zu
Page_Loadöffnen.Fügen Sie den folgenden Code an den
Page_LoadEreignishandler an.Visual C# .NET-Beispielcode
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());Visual Basic .NET-Beispielcode
'Start an instance of the Web service client-side proxy. Dim myProxy As localhost.Service1 = New localhost.Service1() Response.Write(myProxy.HelloWorld())
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Festlegen von Berechtigungen für das Verzeichnis Temp
Führen Sie die folgenden Schritte aus, um dem Arbeitsprozesskonto im Verzeichnis Temp die erforderlichen Berechtigungen zuzuweisen:
Suchen Sie im Windows Explorer nach dem
%windir%Verzeichnis.Klicken Sie mit der rechten
%windir%\tempMaustaste, und wählen Sie dann Eigenschaften aus.Wählen Sie im Eigenschaftenfenster die Registerkarte "Sicherheit" aus.
Wählen Sie "Hinzufügen", geben Sie "ServerName\ASPNET" ein, und wählen Sie dann "OK" aus.
Stellen Sie sicher, dass das Kontrollkästchen "Schreiben" nicht unter "Zulassen" aktiviert ist, und wählen Sie dann OK aus.
Führen Sie die Webanwendung aus.
Möglicherweise erhalten Sie den Fehler, der im Abschnitt "Symptome" dieses Artikels erwähnt wird.