IIS Request Timeout pada operasi ASP.NET yang lama

89

Saya mengalami permintaan waktu tunggu dari IIS ketika saya menjalankan operasi yang lama. Di balik layar, aplikasi ASP.NET saya sedang memproses data, tetapi jumlah record yang sedang diproses sangat besar, dan karenanya pengoperasiannya memakan waktu lama.

Namun, saya pikir IIS menghabiskan sesi. Apakah ini masalah dengan sesi IIS atau ASP.NET?

Terima kasih sebelumnya

Tachi
sumber

Jawaban:

147

Jika Anda ingin memperpanjang jumlah waktu yang diizinkan untuk skrip ASP.NET untuk mengeksekusi, tingkatkan Server.ScriptTimeoutnilainya. Standarnya adalah 90 detik untuk .NET 1.x dan 110 detik untuk .NET 2.0 dan yang lebih baru.

Sebagai contoh:

// Increase script timeout for current page to five minutes
Server.ScriptTimeout = 300;

Nilai ini juga dapat dikonfigurasi di web.configfile Anda di httpRuntimeelemen konfigurasi:

<!-- Increase script timeout to five minutes -->
<httpRuntime executionTimeout="300" 
  ... other configuration attributes ...
/>

masukkan deskripsi gambar di sini

Harap diperhatikan menurut dokumentasi MSDN :

"Batas waktu ini hanya berlaku jika atribut debug dalam elemen kompilasi adalah False. Oleh karena itu, jika atribut debug adalah True, Anda tidak perlu menyetel atribut ini ke nilai yang besar untuk menghindari penghentian aplikasi saat Anda men-debug. "

Jika Anda sudah melakukan ini tetapi menemukan bahwa sesi Anda kedaluwarsa kemudian tingkatkan nilai ASP.NET HttpSessionState.Timeout:

Sebagai contoh:

// Increase session timeout to thirty minutes
Session.Timeout = 30;

Nilai ini juga dapat dikonfigurasi di web.configfile Anda di sessionStateelemen konfigurasi:

<configuration>
  <system.web>
    <sessionState 
      mode="InProc"
      cookieless="true"
      timeout="30" />
  </system.web>
</configuration>

Jika skrip Anda membutuhkan waktu beberapa menit untuk dieksekusi dan ada banyak pengguna yang bersamaan, pertimbangkan untuk mengubah halaman menjadi Halaman Asinkron . Ini akan meningkatkan skalabilitas aplikasi Anda.

Alternatif lain, jika Anda memiliki akses administrator ke server, adalah mempertimbangkan operasi yang berjalan lama ini sebagai kandidat untuk diterapkan sebagai tugas terjadwal atau layanan windows.

Kev
sumber
FYI httpRuntime executionTimeout dalam hitungan detik dan tidak memiliki huruf besar T
Andrew Rimmer
7
Penting juga untuk diperhatikan bahwa mode debug disetel ke false agar nilai batas waktu ini digunakan: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper
@JesseRoper jika Anda dapat mengarahkan saya ke dokumen tentang itu maka saya akan dengan senang hati memasukkannya ke dalam jawaban, atau Anda dapat mengedit jawaban saya secara langsung. Ta.
Kev
Nilai default executionTimeout adalah 110 detik.
frattaro
21

Jawaban hebat dan lengkap, @Kev!

Karena saya melakukan pemrosesan lama hanya di satu halaman admin di aplikasi WebForms, saya menggunakan opsi kode. Tetapi untuk memungkinkan perbaikan cepat sementara pada produksi, saya menggunakan versi konfigurasi di <location>tag di web.config. Dengan cara ini admin / halaman pemrosesan saya mendapat cukup waktu, sementara halaman untuk pengguna akhir dan semacamnya mempertahankan perilaku waktu habis mereka.

Di bawah ini saya memberikan konfigurasi untuk Anda, para Googler, yang membutuhkan perbaikan cepat yang sama. Tentu Anda harus menggunakan nilai lain selain contoh '4 jam' saya, tetapi JANGAN diperhatikan bahwa sesi timeOutdalam hitungan menit, sedangkan permintaan executionTimeoutdalam hitungan detik!

Dan - karena ini sudah 2015 - untuk perbaikan cepat NON Anda harus menggunakan .Net 4.5's async / await sekarang jika memungkinkan, alih-alih halaman ASYNC .NET 2.0 yang canggih ketika KEV menjawab pada tahun 2010 :).

<configuration>
    ... 
    <compilation debug="false" ...>
    ... other stuff ..

    <location path="~/Admin/SomePage.aspx">
        <system.web>
            <sessionState timeout="240" />
            <httpRuntime executionTimeout="14400" />
        </system.web>
    </location>
    ...
</configuration>
Bart
sumber
Saya telah memasukkan potongan "lokasi" di web.config saya tetapi tidak bekerja. Saya hanya menggunakan "executionTimeout", saya tidak membutuhkan "sessionState". Apakah saya harus mengkonfigurasi yang lain. Saya menggunakan NET 4.0. Jika saya menggunakan "httpRuntime" langsung di "system.web", itu berlaku waktu habis dengan benar di semua halaman.
Oliver
12

Saya memposting ini di sini, karena saya telah menghabiskan waktu 3 dan 4 jam untuk itu, dan saya hanya menemukan jawaban seperti yang di atas, yang mengatakan tambahkan executionTime, tetapi itu tidak menyelesaikan masalah dalam kasus itu Anda menggunakan ASP .NET Core . Untuk itu, ini akan berhasil:

Pada file web.config tambahkan requestTimeoutatribut pada aspNetCorenode.

<system.webServer>
  <aspNetCore requestTimeout="00:10:00" ... (other configs goes here) />
</system.webServer>

Dalam contoh ini, saya menetapkan nilai selama 10 menit.

Referensi: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module

Edmundo Rodrigues
sumber
Ini hanya berlaku untuk OutOfProcessmodel hosting. Karena InProcesstidak ada pengaturan batas waktu. IIS akan terus menunggu prosesnya selesai, lihat referensi di sini: github.com/dotnet/AspNetCore.Docs/issues/16870
Rosdi Kasim
-10

Hapus ~karakter di lokasi jadi

path="~/Admin/SomePage.aspx"

menjadi

path="Admin/SomePage.aspx"
sadu
sumber
Itu tidak menjawab pertanyaan
Igor