2012-07-02 62 views
5

Tôi có một số mã lấy dữ liệu từ SQL DB, sau đó lặp lại các bản ghi để tạo chuỗi, cuối cùng sẽ được ghi vào một tệp văn bản.Kết nối đã được đặt lại ASP.NET

Mã chạy tốt trên máy cục bộ của tôi, từ VS, nhưng trên máy chủ trực tiếp, sau khoảng một phút rưỡi, tôi nhận được lỗi "Không nhận dữ liệu" (chrome). Mã dừng ở giữa vòng lặp thông qua DataTable. Hỗ trợ lưu trữ cho biết lỗi "Đã kết nối được đặt lại" đã bị ném.

Tôi không chắc đây có phải là vấn đề thời gian chờ hay không, tôi đã cài đặt executionTimeout trong web.config của tôi (với debug = false) và dường như nó không giúp ích gì. tài sản ScriptTimeout, và nó phù hợp với giá trị executionTimeout thiết lập trong web.config. Thêm vào đó, một thời gian chờ thường sẽ cung cấp cho "trang không sẵn có".

Bất kỳ lời đề nghị được đánh giá cao.

+0

phiên bản nào của Windows Server (IIS) là máy chủ trực tiếp sử dụng? –

+0

Tôi tin rằng đó là 7.5. – Rivka

+0

Tôi đã có cùng một vấn đề và nó đã xảy ra sau ít hơn một giây. Giống như trong trường hợp của bạn, nó chỉ xuất hiện trên một máy chủ nhất định. Hóa ra là nó chỉ xảy ra miễn là chúng ta có đường ống ('|') trong URL của yêu cầu GET. Khi loại bỏ hoặc mã hóa các đường ống, vấn đề không còn xuất hiện nữa. – chiccodoro

Trả lời

3

Có vẻ như đó là trình duyệt đang chờ thời gian chờ phản hồi, chứ không phải trên máy chủ. Bạn không thể kiểm soát những gì trình duyệt đã thiết lập cho điều này. Những gì bạn có thể làm là gửi một phản ứng của một số loại trình duyệt, để nó biết bạn vẫn còn xung quanh và không bị rơi theo một cách nào đó.

Để làm việc này, bạn không thể đợi cho đến khi bạn hoàn thành việc xây dựng toàn bộ chuỗi. Bạn cần phải suy nghĩ lại mã của mình để thay vì gắn thêm vào một chuỗi, bạn đang viết từng bổ sung vào luồng đầu ra. Điều này có thêm lợi thế là một cách hiệu quả hơn để tạo tập tin văn bản của bạn. Vì mục đích giữ cho trình duyệt luôn hoạt động, bạn có thể viết ra bất cứ điều gì, miễn là một số dữ liệu đang quay lại để trình duyệt đọc. Nhận xét html có thể hoạt động cho việc này. Bạn cũng cần phải định kỳ xóa luồng phản hồi của mình để dữ liệu của bạn không được lưu vào bộ đệm trên máy chủ web của bạn. Nếu không, bạn có thể vẫn còn thời gian chờ.

Tất nhiên, giải pháp thực sự ở đây là suy nghĩ lại thiết kế của bạn, sao cho hoạt động của bạn không mất 90 giây cộng với ngay từ đầu. Nhưng cho đến khi bạn có thể làm điều đó, hy vọng điều này là hữu ích.

+0

Cảm ơn. Nếu nó chỉ là thời gian của trình duyệt, liệu máy chủ có tiếp tục chạy không? Trong trường hợp của tôi, ngoài việc tắt trình duyệt, toàn bộ hoạt động cũng dừng lại. Tôi có thể thấy điều này với nhật ký của mình. – Rivka

+0

@Rivka - trình duyệt tắt kết nối tcp, làm mất hiệu lực yêu cầu http và vì vậy máy chủ dừng. –

0

họ sẽ thốt lên một timeout, bạn có thể thử và trả lại thông tin thông qua một View, điều này chắc chắn sẽ tăng tốc độ. (nếu có thể).

+0

Việc truy xuất dữ liệu thực tế là tốt. Mã đã vượt qua điều đó. Nó lần ra trong vòng DataTable trong C#. – Rivka

5

sau khoảng một phút và một nửa

Có vấn đề của bạn. Đây là một ứng dụng web? Một phút rưỡi là thời gian rất dài để ứng dụng web phản hồi yêu cầu. Đủ lâu để nó không thực sự đáng tham gia vào nhiều thủ đoạn khác nhau để biến nó thành loại công việc.

Bạn sẽ muốn giảm tải quá trình này trở nên không đồng bộ hơn với chính ứng dụng web. Bản chất của các ứng dụng web là họ sẽ nhận được yêu cầu và phản hồi kịp thời. Những gì bạn có ở đây là một quy trình chạy dài không thể đáp ứng kịp thời. Ứng dụng web có thể tạo điều kiện tương tác với dữ liệu, nhưng không trực tiếp xử lý việc xử lý chúng trong yêu cầu/phản hồi trực tiếp.

Ứng dụng web tương tác với quy trình như thế nào? Nó chỉ bắt đầu nó, hay nó cung cấp thông tin cho quá trình để bắt đầu? Tôi muốn đề nghị rằng quá trình tự nó được xử lý bởi một cái gì đó giống như một dịch vụ Windows hoặc có lẽ là một ứng dụng giao diện điều khiển. Các de-coupled từ các ứng dụng web, thì càng tốt. Bây giờ, vì tôi không biết gì về quá trình này, tôi đang đưa ra một vài giả định về hành vi của nó ...

Ứng dụng web có thể nhận được yêu cầu bắt đầu quá trình, cùng với mọi thông tin cần thiết cho quá trình. Nó có thể lưu trữ điều này trong một cơ sở dữ liệu với một giá trị trạng thái (đang chờ xử lý, xếp hàng đợi, vv) và sau đó trả lời người dùng (một cách kịp thời) rằng yêu cầu đã được nhận và quá trình đã được xếp hàng đợi. Ứng dụng web có thể có một trang kiểm tra trạng thái để người dùng có thể xem quy trình đang hoạt động như thế nào (nếu nó bắt đầu, số lượng bản ghi đã trải qua, v.v.).

Ứng dụng ngoại tuyến (Windows Service, et al) sẽ chỉ giám sát cơ sở dữ liệu đó để xử lý dữ liệu mới xếp hàng. Khi nó nhìn thấy nó, nó cập nhật trạng thái (chạy, xử lý, v.v.) và cung cấp bất kỳ phản hồi có liên quan nào trong quá trình (số lượng bản ghi được xử lý, v.v.) bằng cách cập nhật dữ liệu đó. Vì vậy, ứng dụng ngoại tuyến và ứng dụng web đều tương tác với cùng một dữ liệu, nhưng không theo cách chặn luồng của ứng dụng web và ngăn phản hồi cho người dùng.

Khi quá trình kết thúc, trạng thái được cập nhật lại. Ứng dụng web có thể cho biết rằng ứng dụng đã hoàn tất và cung cấp liên kết để tải xuống kết quả.Quá trình ngoại tuyến thậm chí có thể gửi email cho người dùng khi hoàn thành hoặc có thể ứng dụng web có thể có một số loại hệ thống thông báo (tôi đang hình dung các biểu tượng thông báo nhỏ trên Facebook), cảnh báo người dùng sẽ có hoạt động mới.

Bằng cách này, luồng không bị chặn, người dùng có thể tiếp tục tương tác với ứng dụng (nếu có bất kỳ thứ gì tương tác), v.v. Và bạn cũng nhận được các lợi ích bổ sung khác. Ví dụ, kết quả của quá trình này do đó được lưu trong cơ sở dữ liệu và tự động theo dõi lịch sử.

+0

Tôi thực sự có kế hoạch làm cho điều này không đồng bộ (sử dụng ASP.NET Web API hy vọng) Tuy nhiên, tôi cần một giải pháp trong khi chờ đợi, miễn là tôi vẫn đi tuyến đường này. – Rivka

0

Khi tôi đã có lỗi này, tôi đã có thể giải quyết nó bằng cách thêm trong file Web.config:

<system.web> 
    <httpRuntime executionTimeout="600" maxRequestLength="51200" /> 
</system.web> 
Các vấn đề liên quan