Thời gian chờ yêu cầu IIS khi hoạt động ASP.NET dài


87

Tôi đang gặp phải yêu cầu hết thời gian chờ từ IIS khi tôi chạy một hoạt động dài. Phía sau ứng dụng ASP.NET của tôi đang xử lý dữ liệu, nhưng số lượng bản ghi đang được xử lý rất lớn và do đó quá trình hoạt động mất nhiều thời gian.

Tuy nhiên, tôi nghĩ rằng IIS hết phiên. Đây có phải là sự cố với phiên IIS hoặc ASP.NET không?

Cảm ơn trước

Câu trả lời:


146

Nếu bạn muốn kéo dài khoảng thời gian được phép để tập lệnh ASP.NET thực thi thì hãy tăng Server.ScriptTimeoutgiá trị. Mặc định là 90 giây cho .NET 1.x và 110 giây cho .NET 2.0 trở lên.

Ví dụ:

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

Giá trị này cũng có thể được định cấu hình trong web.configtệp của bạn trong httpRuntimephần tử cấu hình:

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

nhập mô tả hình ảnh ở đây

Vui lòng lưu ý theo tài liệu MSDN :

"Thời gian chờ này chỉ áp dụng nếu thuộc tính gỡ lỗi trong phần tử biên dịch là Sai. Do đó, nếu thuộc tính gỡ lỗi là Đúng, bạn không phải đặt thuộc tính này thành giá trị lớn để tránh ứng dụng bị tắt trong khi gỡ lỗi. "

Nếu bạn đã làm điều này nhưng nhận thấy rằng phiên của bạn sắp hết hạn thì hãy tăng HttpSessionState.Timeoutgiá trị ASP.NET :

Ví dụ:

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

Giá trị này cũng có thể được định cấu hình trong web.configtệp của bạn trong sessionStatephần tử cấu hình:

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

Nếu tập lệnh của bạn mất vài phút để thực thi và có nhiều người dùng đồng thời thì hãy xem xét việc thay đổi trang thành Trang không đồng bộ . Điều này sẽ làm tăng khả năng mở rộng ứng dụng của bạn.

Một giải pháp thay thế khác, nếu bạn có quyền truy cập của quản trị viên vào máy chủ, là coi hoạt động đang hoạt động lâu dài này như một ứng cử viên để triển khai dưới dạng tác vụ đã lên lịch hoặc dịch vụ windows.


FYI httpRuntime executionTimeout là trong vài giây và không có chữ hoa T
Andrew Rimmer

7
Cũng cần lưu ý rằng chế độ gỡ lỗi được đặt thành false để giá trị thời gian chờ này được sử dụng: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper

@JesseRoper nếu bạn có thể chỉ cho tôi tài liệu về tài liệu đó thì tôi rất sẵn lòng đưa tài liệu đó vào câu trả lời hoặc bạn có thể chỉnh sửa câu trả lời của tôi trực tiếp. Ta.
Kev

Giá trị thời gian chờ thực thi mặc định là 110 giây.
frattaro

20

Câu trả lời tuyệt vời và đầy đủ của @Kev!

Vì tôi chỉ xử lý lâu trong một trang quản trị trong ứng dụng WebForms nên tôi đã sử dụng tùy chọn mã. Nhưng để cho phép sửa chữa nhanh tạm thời trong quá trình sản xuất, tôi đã sử dụng phiên bản cấu hình trong <location>thẻ trong web.config. Bằng cách này, trang quản trị / xử lý của tôi có đủ thời gian, trong khi các trang dành cho người dùng cuối và những trang đó vẫn giữ hành vi hết thời gian cũ.

Dưới đây, tôi đã đưa ra cấu hình cho bạn mà nhân viên Google cần sửa nhanh tương tự. Tất nhiên bạn nên sử dụng các giá trị khác với ví dụ '4 giờ' của tôi, nhưng NÊN lưu ý rằng phiên tính timeOutbằng phút, trong khi yêu cầu tính executionTimeoutbằng giây!

Và - vì nó đã là năm 2015 - đối với NON- quickfix, bạn nên sử dụng async / await của .Net 4.5 ngay bây giờ nếu có thể, thay vì trang ASYNC của .NET 2.0 đã trở thành hiện đại khi KEV trả lời vào năm 2010 :).

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

    <location path="~/Admin/SomePage.aspx">
        <system.web>
            <sessionState timeout="240" />
            <httpRuntime executionTimeout="14400" />
        </system.web>
    </location>
    ...
</configuration>

Tôi đã đưa đoạn mã "vị trí" vào web.config của mình nhưng nó không hoạt động. Tôi chỉ đang sử dụng "executeTimeout", tôi không cần "sessionState". Tôi có phải cấu hình thứ gì khác không. Tôi đang sử dụng NET 4.0. Nếu tôi sử dụng "httpRuntime" trực tiếp trong "system.web", nó sẽ áp dụng thời gian chờ chính xác trong tất cả các trang.
Oliver

11

Tôi đăng bài này ở đây, bởi vì tôi đã dành 3 và 4 giờ cho nó và tôi chỉ tìm thấy các câu trả lời như câu trả lời ở trên, có nghĩa là có thêm executionTime, nhưng nó không giải quyết được vấn đề trong trường hợp đó bạn đang sử dụng ASP .NET Core . Đối với nó, điều này sẽ hoạt động:

Tại tệp web.config, thêm requestTimeoutthuộc tính tại aspNetCorenút.

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

Trong ví dụ này, tôi đang đặt giá trị trong 10 phút.

Tham khảo: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module


Điều này chỉ áp dụng cho OutOfProcessmô hình lưu trữ. Vì InProcesskhông có cài đặt thời gian chờ. IIS sẽ tiếp tục đợi quá trình hoàn tất, tham khảo tại đây: github.com/dotnet/AspNetCore.Docs/issues/16870
Rosdi Kasim

-9

Xóa ~ký tự ở vị trí

path="~/Admin/SomePage.aspx"

trở thành

path="Admin/SomePage.aspx"

Nó không trả lời câu hỏi
Igor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.