2016-01-06 12 views

Trả lời

3

Cách tốt nhất mà tôi đã tìm thấy cho đến nay để xử lý một kịch bản chạy dài (nếu ứng dụng của bạn chỉ đơn giản là không thể tránh được việc một) là để trước hết là tạo ra một handler async:

public async Task<IActionResult> About() 
    { 
      var cts = new CancellationTokenSource();    
      cts.CancelAfter(180000); 
      await Task.Delay(150000, cts.Token); 
     return View(); 
    } 

Trong đoạn trên, chúng tôi đã thêm một mã thông báo hủy để nói rằng phương pháp Async của tôi sẽ hủy sau 180 giây (mặc dù trong ví dụ này nó sẽ không bao giờ trì hoãn lâu hơn 150 giây) Tôi đã thêm thời gian chờ để đảm bảo có giới hạn về thời lượng của tập lệnh chạy.

Nếu bạn chạy điều này, bạn sẽ nhận được Lỗi HTTP 502.3 vì có một khoảng thời gian chờ được đặt trên httpPlatform của 00:02:00.

Để kéo dài thời gian chờ này, hãy truy cập tệp web.config bên trong thư mục wwwroot và thêm thuộc tính requestTimeout = "00:05:00" vào phần tử httpPlatform. Ví dụ:

<httpPlatform requestTimeout="00:05:00" processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/> 

Tập lệnh chạy dài giờ sẽ hoạt động.

Tuy nhiên, điều này có nghĩa là mọi yêu cầu sẽ mất 5 phút để hết giờ, do đó bạn sẽ phải đảm bảo rằng bạn sử dụng thủ thuật Hủy bỏ để hạn chế mọi yêu cầu không đồng bộ trong ứng dụng của bạn. Trong các phiên bản trước của MVC, chúng tôi đã có thuộc tính AsyncTimeOut mà bạn có thể thêm vào bộ điều khiển, nhưng có vẻ như điều này đã bị cắt trong MVC6 See GitHub aspnet/mvc Issue #2044

+0

Cảm ơn bạn đã trả lời rất thú vị, nhưng điều này là không thể chấp nhận được cho vấn đề của tôi: "Tuy nhiên, điều này có nghĩa là mọi yêu cầu sẽ mất 5 phút để hết thời gian chờ ..." Tôi chỉ cần giải pháp lập trình mà không cần bất kỳ sự can thiệp web.config nào. –

+1

Theo tôi biết không có cách nào có lập trình để làm điều này do cách IIS là proxy cho DNX. Nếu bạn không chỉnh sửa giá trị đó thì yêu cầu sẽ luôn 502 sau 2 phút –

+0

@MartinBeeby Thêm dòng này bây giờ khiến ứng dụng thất bại khi khởi động, có vẻ như không có nút '' ở đó theo mặc định ngay bây giờ –

Các vấn đề liên quan