İstemci uygulaması bir web hizmetini çağırdığında System.IO.FileNotFoundException hatası alıyorsunuz

Bu makale, bir ASP.NET Web uygulaması bir web hizmetini çağırdığında oluşan sorunu System.IO.FileNotFoundException çözmenize yardımcı olur.

Orijinal ürün sürümü: ASP.NET
Özgün KB numarası: 823196

Belirtiler

ASP.NET bir web uygulamasında bir web hizmetini çağırdığınızda aşağıdaki hatayı alabilirsiniz:

System.IO.FileNotFoundException

Neden

Aşağıdaki koşullardan biri doğruysa hatayı alabilirsiniz:

  • Çalışan işleminin Temp dizinine okuma izinleri yoktur ve çalışan işleminin temp dizinine yazma izinleri yoktur.

    Not

    sınıfı, XmlSerializer serileştirme ve seri durumdan çıkarma gerçekleştirmek için anında kod oluşturur ve derler. XmlSerializer derlemeyi gerçekleştirmek için Kod Belgesi Nesne Modeli'ni (CodeDom) kullanır. CodeDom derlemesi disk üzerindeki geçici dosyaları kullanır. Çalışan işleminin Temp dizininde okuma izinleri ve Temp dizinindeki yazma izinleri yoksa, Web hizmetine yapılan tüm çağrılar başarısız olur. Bu nedenle, çalışan işlemi Temp dizininde okuma izinlerini ve Temp dizininde yazma izinlerini gerektirir.

  • Oluşturulan kodda XmlSerializer derleme hataları var.

Çözüm 1: Temp dizininde çalışan işlem hesabına izin atama

Bu sorunu çözmek için, ASP.NET çalışan işlem hesabının (uygulamanız Internet Information Services (IIS) 6.0'a dağıtıldıysa ASPNET hesabı veya AĞ HİzMETİ hesabı) Temp dizininde okuma ve yazma erişimine sahip olmalıdır.

Not

Kimliğe bürünme kullanıyorsanız, kimliğine bürünülen kullanıcının Temp dizininde tam erişimi olmalıdır.

Temp dizinindeki çalışan işlem hesabına gerekli izinleri atamak için şu adımları izleyin:

  1. Windows Gezgini'nde öğesini %windir%\temp directorybulun.

  2. öğesine sağ tıklayın %windir%\tempve Özellikler'i seçin.

  3. Özellikler penceresinde Güvenlik sekmesini seçin.

  4. Ekle'yi seçin, SunucuAdı\ASPNET yazın ve ardından Tamam'ı seçin.

    Not

    ServerName değerini web sunucusunun adıyla değiştirin.

    Uygulamanızı IIS 6.0'a dağıttıysanız ASPNET'iAĞ HİzMETİ ile değiştirin.

  5. İzin Ver'in altında Tam Denetim onay kutusunu ve ardından Tamam'ı seçin.

Çözüm 2: XmlSerializer tarafından oluşturulan kodda derleyici hatalarını bulma

Derleyici tarafından oluşturulan hataları bulmak için, derleyici tarafından oluşturulan dosyaları tutmak için Web.config dosyasına bir anahtar eklemeniz gerekir. Bunu yapmak için şu adımları uygulayın:

  1. Web.config dosyasını Not Defteri gibi bir metin düzenleyicisinde açın.

  2. Kodun <system.diagnostics> bölümüne aşağıdaki gibi bir XmlSerialization.Compilation anahtar ekleyin:

    <configuration>
        <system.diagnostics>
            <switches>
                <add name="XmlSerialization.Compilation" value="4"/>
            </switches>
        </system.diagnostics>
    </configuration>
    
  3. İstemci uygulamasını çalıştırın.

    İstemci uygulaması web hizmetini çağırır.

  4. Dizinin _tmpname.00.cs dosyasına ve _tmpname.out dosyasına sahip olduğunu %windir%\temp doğrulayın.

    oluşturulan kaynak _tmpname.00.cs dosyasıdır. _tmpname.out dosyasında derleyici hataları olmalıdır.

    Not

    Temp dizininde dosya yazmak için okuma izinlerini etkinleştirin ve çalışan işlem hesabına (ASPNET veya AĞ HİzMETİ) yazma %tmpname% izinlerini etkinleştirin.

Durum

Bu davranış tasarımdan kaynaklanır.

Davranışı yeniden oluşturma adımları

Aşağıdaki bölümlerde, davranışı yeniden oluşturma adımları hakkında bilgi sağlanır.

Web hizmeti oluşturma

  1. Visual Studio .NET'i başlatın.

  2. Visual C# .NET veya Visual Basic .NET kullanarak yeni bir ASP.NET Web hizmeti projesi oluşturun.

    Varsayılan olarak Service1.asmx oluşturulur.

  3. Projeyi WebServiceTemp olarak adlandırın.

  4. Çözüm Gezgini'da Service1.asmx öğesine sağ tıklayın ve Kodu Görüntüle'yi seçin.

  5. Service1.asmx.cs dosyasında (veya Visual Basic .NET kullanıyorsanız Service1.asmx.vb dosyasında), varsayılan HelloWorld() web yönteminin açıklamasını kaldırın.

  6. Derleme menüsünde Çözüm Derle'yi seçin.

İstemci web uygulaması oluşturma

  1. Visual C# .NET veya Visual Basic .NET kullanarak yeni bir ASP.NET Web uygulaması oluşturun.

  2. Projeyi WebAppTemp olarak adlandırın.

  3. Çözüm Gezgini'da Başvurular'a sağ tıklayın ve Ardından Web Başvurusu Ekle'yi seçin.

  4. Adres metin kutusuna WebServiceTemp için aşağıdaki URL'yi yazın:
    http://localhost/WebServiceTemp/Service1.asmx

  5. Git'i ve ardından Başvuru Ekle'yi seçin.

  6. Olay kodunu açmak için WebForm1'e Page_Load çift tıklayın.

  7. Olay işleyicisine Page_Load aşağıdaki kodu ekleyin.

    • Visual C# .NET örnek kodu

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

      'Start an instance of the Web service client-side proxy.
      Dim myProxy As localhost.Service1 = New localhost.Service1()
      Response.Write(myProxy.HelloWorld())
      
  8. Derleme menüsünde Çözüm Derle'yi seçin.

Temp dizininde izinleri ayarlama

Temp dizinindeki çalışan işlem hesabına gerekli izinleri atamak için şu adımları izleyin:

  1. Windows Gezgini'nde dizini bulun %windir% .

  2. öğesine sağ tıklayın %windir%\tempve Özellikler'i seçin.

  3. Özellikler penceresinde Güvenlik sekmesini seçin.

  4. Ekle'yi seçin, SunucuAdı\ASPNET yazın ve ardından Tamam'ı seçin.

  5. İzin Ver altında Yazma onay kutusunun seçili olmadığından emin olun ve tamam'ı seçin.

  6. Web uygulamasını çalıştırın.

    Bu makalenin Belirtiler bölümünde belirtilen hatayı alabilirsiniz.