2012-05-22 45 views
6

Tôi đã cố gắng để thiết lập các executionTimeout trong file web.config:Làm cách nào để đặt IHttpAsyncHandler hết thời gian chờ?

<compilation debug="false" targetFramework="4.5"> 
<httpRuntime executionTimeout="30"/> 

Nhìn vào trang yêu cầu IIS Manager Tôi có thể thấy yêu cầu không được chấm dứt sau 30 giây.
Tôi có nên triển khai Bộ hẹn giờ bên trong IHttpAsyncHandler của mình không?

+0

Tôi khuyên bạn nên tìm hiểu lý do tại sao mã của bạn chạy lâu hơn bạn muốn và có kiểm tra định kỳ trong đó để ngừng thực thi và trả lại mã cho đến thời điểm này, nếu có thể. –

+0

@ andrew-barber Tôi đang sử dụng IHttpAsyncHandler để chia sẻ dài (để thông báo psuh cho khách hàng). Đó là nghĩa vụ phải có thời gian chạy dài, nhưng tôi vẫn muốn có một thời gian chờ. – Adir

Trả lời

4

Với sự thiếu rõ ràng hỗ trợ sẵn cho thời gian chờ IHttpAsyncHandler, có lẽ bạn phải quản lý thời gian chờ của riêng mình. Có lẽ đây là do thiết kế; sau khi tất cả các bạn đang lựa chọn một mô hình không đồng bộ - những người không MSFT nghĩ rằng họ đang cố gắng thiết lập một thời gian chờ mặc định cho nhiệm vụ chạy dài của bạn?

Điều tôi sẽ làm là sử dụng ThreadPool.RegisterWaitForSingleObject để quản lý cuộc thăm dò của bạn với thời gian chờ phù hợp. Đây là một mẫu mã tôi sử dụng để tránh phải chờ đợi vào một dịch vụ web mà không bao giờ trở lại:

private const int REQUEST_TIMEOUT = 30000; // miliseconds (30 sec) 
private void CallService() 
     { 
     try { 
      string url = "somewebservice.com"; 
      WebRequest request = WebRequest.Create(url); 

      // Asynchronously fire off the request 
      IAsyncResult result = request.BeginGetResponse(new AsyncCallback(MyRoutineThatUsesTheResults), request); 

      // Handle timed-out requests 
      ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(RequestTimeout), request, REQUEST_TIMEOUT, true); 
     } 
     catch (Exception ex) { 
       _logger.Error("Error during web service request.", ex); 
     } 

private void RequestTimeout(object state, bool timedOut) 
     { 
      if (timedOut) { 
       WebRequest request = (WebRequest)state; 
       _logger.WarnFormat("Request to {0} timed out (> {1} sec)", request.RequestUri.ToString(), REQUEST_TIMEOUT/1000); 
       request.Abort(); 
      } 
     } 

Bạn sẽ cần một IAsyncResult để làm việc với phương pháp này nhưng đó là một mô hình thành lập bạn không nên có khó khăn khi chạy xuống mẫu về .

Ngoài ra, bạn sẽ gặp sự cố khi IIS quyết định tái chế nhóm ứng dụng/rách miền ứng dụng của bạn trong khi bỏ phiếu vẫn đang chạy. Nếu đó là điều kiện bạn muốn xử lý, bạn có thể sử dụng HostingEnvironment.RegisterObject.

0

Bạn có thể thử để thêm video này vào tập tin web.config của bạn:

<system.web> 
    <pages asyncTimeout="30" /> 
</system.web> 

nó cho PageAsyncTask, nhưng chỉ có thể được vinh danh cho IHttpAsyncHandler quá?

Nếu không, bạn có thể có may mắn hơn với các mới HttpTaskAsyncHandler trong ASP.Net 4.5 phiên bản: http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097378

+0

Dường như không ảnh hưởng đến trình xử lý – Adir

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