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 XmlSerializer Klasse generiert und kompiliert Code im laufenden Betrieb, um die 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 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:

  1. Suchen Sie in Windows Explorer nach der %windir%\temp directory .

  2. Klicken Sie mit der rechten %windir%\temp Maustaste, und wählen Sie dann Eigenschaften aus.

  3. Wählen Sie im Eigenschaftenfenster die Registerkarte "Sicherheit" aus.

  4. 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.

  5. 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:

  1. Öffnen Sie dieWeb.config-Datei in einem Text-Editor, z. B. Editor.

  2. Fügen Sie dem Codeabschnitt wie folgt einen XmlSerialization.Compilation Schalter <system.diagnostics> hinzu:

    <configuration>
        <system.diagnostics>
            <switches>
                <add name="XmlSerialization.Compilation" value="4"/>
            </switches>
        </system.diagnostics>
    </configuration>
    
  3. Führen Sie die Clientanwendung aus.

    Die Clientanwendung ruft den Webdienst auf.

  4. Stellen Sie sicher, dass das %windir%\temp Verzeichnis ü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

  1. Starten Sie Visual Studio .NET.

  2. Erstellen Sie ein neues ASP.NET Webdienstprojekt mit Visual C# .NET oder Visual Basic .NET.

    Standardmäßig wird "Service1.asmx" erstellt.

  3. Geben Sie dem Projekt den Namen WebServiceTemp.

  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf "Service1.asmx", und wählen Sie dann Code anzeigen aus.

  5. 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.

  6. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.

Erstellen einer Clientwebanwendung

  1. Erstellen Sie eine neue ASP.NET Webanwendung mit Visual C# .NET oder Visual Basic .NET.

  2. Geben Sie dem Projekt den Namen WebAppTemp.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Verweise, und wählen Sie dann Webverweis hinzufügen aus.

  4. Geben Sie im Textfeld "Adresse" die folgende URL für WebServiceTemp ein:
    http://localhost/WebServiceTemp/Service1.asmx

  5. Wählen Sie "Wechseln" und dann "Verweis hinzufügen" aus.

  6. Doppelklicken Sie auf WebForm1, um den Ereigniscode zu Page_Load öffnen.

  7. 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())
      
  8. 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:

  1. Suchen Sie im Windows Explorer nach dem %windir% Verzeichnis.

  2. Klicken Sie mit der rechten %windir%\temp Maustaste, und wählen Sie dann Eigenschaften aus.

  3. Wählen Sie im Eigenschaftenfenster die Registerkarte "Sicherheit" aus.

  4. Wählen Sie "Hinzufügen", geben Sie "ServerName\ASPNET" ein, und wählen Sie dann "OK" aus.

  5. Stellen Sie sicher, dass das Kontrollkästchen "Schreiben" nicht unter "Zulassen" aktiviert ist, und wählen Sie dann OK aus.

  6. Führen Sie die Webanwendung aus.

    Möglicherweise erhalten Sie den Fehler, der im Abschnitt "Symptome" dieses Artikels erwähnt wird.