Sie erhalten einen System.IO.FileNotFoundException-Fehler, wenn die Clientanwendung einen Webdienst aufruft.
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 die folgende Fehlermeldung angezeigt:
System.IO.FileNotFoundException
Ursache
Möglicherweise wird die Fehlermeldung angezeigt, wenn eine der folgenden Bedingungen zutrifft:
Der Arbeitsprozess verfügt nicht über Die Berechtigung zum Lesen in das Verzeichnis "Temp" des Prozesses, und der Arbeitsprozess verfügt nicht über Die Berechtigung zum Schreiben in das Verzeichnis "Temp" des Prozesses.
Notiz
Die
XmlSerializer
Klasse generiert und kompiliert Code im Laufenden, um Serialisierung und Deserialisierung durchzuführen.XmlSerializer
verwendet 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 des Webdiensts fehl. Daher erfordert der Arbeitsprozess die Leseberechtigungen für das Verzeichnis "Temp" und die Schreibberechtigungen für das Verzeichnis "Temp".Der generierte Code
XmlSerializer
enthält Kompilierungsfehler.
Lösung 1: Zuweisen von Berechtigungen für das Arbeitsprozesskonto im Verzeichnis "Temp"
Um dieses Problem zu beheben, muss das ASP.NET Arbeitsprozesskonto (das ASPNET-Konto oder das NETZWERKDIENST-Konto, wenn Ihre Anwendung auf Internetinformationsdienste (IIS) 6.0 bereitgestellt wird) Lese- und Schreibzugriff auf das Verzeichnis Temp haben.
Notiz
Wenn Sie den Identitätswechsel verwenden, muss der imitierte Benutzer vollzugriff auf das Verzeichnis "Temp" haben.
Führen Sie die folgenden Schritte aus, um dem Arbeitsprozesskonto im Verzeichnis "Temp" erforderliche Berechtigungen zuzuweisen:
Suchen Sie im Windows-Explorer nach dem
%windir%\temp directory
.Klicken Sie mit der rechten Maustaste
%windir%\temp
, und wählen Sie dann "Eigenschaften" aus.Wählen Sie im Fenster "Eigenschaften " die Registerkarte "Sicherheit " aus.
Wählen Sie "Hinzufügen", geben Sie "ServerName\ASPNET" ein, und wählen Sie dann "OK" aus.
Notiz
Ersetzen Sie ServerName durch den Namen des Webservers.
Ersetzen Sie ASPNET durch NETZWERKDIENST , wenn Sie Ihre Anwendung in IIS 6.0 bereitgestellt haben.
Aktivieren Sie unter "Zulassen" das Kontrollkästchen "Vollzugriff " und dann " OK".
Lösung 2: Ermitteln von Compilerfehlern im Code, den XmlSerializer generiert hat
Um Fehler zu finden, die vom Compiler generiert werden, müssen Sie der Datei "Web.config " einen Switch hinzufügen, um vom Compiler generierte Dateien beizubehalten. Gehen Sie dazu wie folgt vor:
Öffnen Sie die Datei "Web.config " in einem Text-Editor, z. B. Editor.
Fügen Sie wie folgt einen
XmlSerialization.Compilation
<system.diagnostics>
Schalter zum Codeabschnitt 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%\temp
Verzeichnis über die datei _tmpname.00.cs und die Datei _tmpname.out verfügt.Die _tmpname.00.cs Datei ist die generierte Quelle. Die Datei _tmpname.out sollte die Compilerfehler aufweisen.
Notiz
Aktivieren Sie die Leseberechtigungen, und aktivieren Sie die Schreibberechtigungen für das Arbeitsprozesskonto (ASPNET oder NETWORK SERVICE), um Dateien im Temp-Verzeichnis zu schreiben
%tmpname%
.
Status
Es handelt sich hierbei um ein beabsichtigtes Verhalten.
Schritte zum Reproduzieren des Verhaltens
In den folgenden Abschnitten finden Sie Informationen zu Schritten zum Reproduzieren des Verhaltens.
Erstellen eines Webdiensts
Starten Sie Visual Studio .NET.
Erstellen Sie ein neues ASP.NET Webdienstprojekt mithilfe von Visual C# .NET oder Visual Basic .NET.
Standardmäßig wird Service1.asmx erstellt.
Nennen Sie das Projekt WebServiceTemp.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf "Service1.asmx", und wählen Sie dann "Code anzeigen" aus.
Heben Sie in der Service1.asmx.cs Datei (oder der Service1.asmx.vb Datei, wenn Sie Visual Basic .NET verwenden) die Kommentare der Standardwebmethode
HelloWorld()
auf.Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen einer Clientwebanwendung
Erstellen Sie eine neue ASP.NET Webanwendung mithilfe von Visual C# .NET oder Visual Basic .NET.
Nennen Sie das Projekt WebAppTemp.
Klicken Sie in 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.asmx
Wählen Sie "Gehe zu" und dann "Verweis hinzufügen" aus.
Doppelklicken Sie auf WebForm1, um den
Page_Load
Ereigniscode zu öffnen.Fügen Sie den folgenden Code an den
Page_Load
Ereignishandler 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" erforderliche Berechtigungen zuzuweisen:
Suchen Sie im Windows-Explorer das
%windir%
Verzeichnis.Klicken Sie mit der rechten Maustaste
%windir%\temp
, und wählen Sie dann "Eigenschaften" aus.Wählen Sie im Fenster "Eigenschaften " 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" unter "Zulassen" nicht 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.