2012-05-09 49 views
7

Tôi có giao diện điều khiển/trang web Asp.Net 4.0 sử dụng bảng cập nhật và một số nút. Bảng điều khiển cập nhật được kết nối với bộ hẹn giờ thực hiện sau mỗi 5 giây, gây ra một phần postback. Các nút Toggles một số cài đặt và sau đó buộc một bản cập nhật của bảng điều khiển cập nhật thông qua một cuộc gọi tương tự như sau:ASP.NET Ajax postback đột nhiên dừng trên IPhone/IPad

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm._doPostBack('<%= UpdatePanel.ClientID %>', ''); 
return true; 

trang web này chạy tốt trên trình duyệt IE/Firefox và trên các thiết bị di động Safari (iPhone/iPad) nhưng trên điện thoại di động thiết bị postback ngẫu nhiên và âm thầm ngừng hoạt động. Tôi tìm số này có thể phải làm với việc tiết kiệm pin và safari sẽ tắt chức năng chờ một phần khi không hoạt động. Vấn đề là khi người dùng quay trở lại trang web, postback bị tắt hoàn toàn và cả timer cũng như các nút đều không gây ra bất kỳ postback nào nữa. (Tôi đã theo dõi lưu lượng mạng trên máy chủ để xác minh điều này). Ngay cả khi người dùng làm mới trang web (nhiều lần), một phần postback lại phát lại. Nó chỉ dừng đăng dữ liệu lên máy chủ. Sau đó đột nhiên và không có lý do cụ thể postback bắt đầu làm việc trở lại. Thời gian ngừng hoạt động thường lên đến 10 phút, điều này hoàn toàn làm cho trang web của tôi vô dụng vì mục đích của nó.

Cho rằng phải mất quá lâu trước khi đăng lại bắt đầu lại, tôi tự hỏi liệu có bất kỳ cài đặt nào ở phía máy khách hoặc trong IIS để chơi không?

Trang web sẽ chỉ chạy trên các thiết bị khách hàng của tôi, không công khai, vì vậy nếu có bất kỳ cài đặt nào để phát trên máy khách, tôi sẽ thực hiện.

Tôi thực sự bối rối về điều này và không tìm thấy cách kích hoạt "lỗi", thỉnh thoảng điều đó xảy ra. Bất kỳ lời khuyên và lời khuyên được nhiều đánh giá cao.


Cập nhật:

gia tăng một số xử lý lỗi và tôi có (không liên tục) nhận được thông báo sau khi postback thất bại:

Trang đang thực hiện một postback async nhưng ScriptManager. Thuộc tính SupportParialRendering được đặt thành false. Đảm bảo rằng thuộc tính được đặt thành true trong khi đăng lại.

Rất tiếc, thuộc tính này rõ ràng là đúng đối với thiết bị trong trường hợp đầu tiên, nếu không, đăng lại sẽ không bao giờ hoạt động, không phải như vậy.


Cập nhật 2: Tìm thấy bài đăng trên blog folloing đề nghị thay đổi cài đặt trình duyệtCap trong web.config. Đang thử điều này ngay bây giờ. Sẽ báo cáo lại. Các đề xuất khác vẫn được nhiều người hoan nghênh. ASP.NET 4 BrowserCaps (or: what were they thinking?)

Tự động tắt javascript ở chế độ toàn màn hình di động ở chế độ toàn màn hình (chạy từ màn hình chính). Bài viết sau đây đề xuất khắc phục sự cố này. Gotcha: iPad versus ASP.NET

Trả lời

6

Phát hiện trong "cập nhật 2" trong câu hỏi của tôi giải quyết được vấn đề. Rõ ràng UserAgents Safari thỉnh thoảng nhận là Mozilla 0.0, như được xác định trong các bài viết trên blog sau: ASP.NET 4 BrowserCaps (or: what were they thinking?):

Các WTF đầu tiên là khuôn khổ NET thực sự ném một ngoại lệ nếu nó phát hiện một postback async từ một trình duyệt mà theo vào BrowserCaps không hỗ trợ postback không đồng bộ.Nó giống như họ nghĩ rằng họ biết rõ nhất ai có khả năng postback không đồng bộ ngay cả với bằng chứng áp đảo ngược lại…

WTF tiếp theo khó tìm hơn. Tại sao Safari UserAgents đôi khi được công nhận là Mozilla 0.0 và tại sao tôi không bao giờ có thể tái tạo vấn đề ngay cả khi sử dụng chuỗi UserAgent mà tôi vừa sao chép từ một ngoại lệ?

Câu trả lời nằm trong

<browserCaps userAgentCacheKeyLength="64" />

Cài đặt mặc định cho người sử dụng đại lý bộ nhớ cache dài khóa là để lấy 64 ký tự đầu tiên của chuỗi UserAgent. ...

Và tiếp tục xuống trang:

Thiết lập userAgentCacheKeyLength 256 đã giải quyết được vấn đề, mặc dù vẫn còn những chuỗi UserAgent ra khỏi đó được xác định là Mozilla 0.0. Ít nhất thì giờ nó nhất quán.

Vì vậy, hãy đặt <browserCaps userAgentCacheKeyLength="256" /> trong Web.Config giải quyết vấn đề.


này không may gây ra một vấn đề khác khi trình duyệt Safari được sử dụng trong chế độ toàn màn hình (liên kết đã lưu trên màn hình chủ). Trong chế độ toàn màn hình, Safari sử dụng một chuỗi tác nhân người dùng HTTP khác và ASP.NET không còn nhận ra trình duyệt là Safari, thay vào đó nó nhận ra nó là trình duyệt chung không có khả năng và ví dụ JavaScript và JQuery sẽ ngừng hoạt động. Việc này được xây dựng thêm trong Gotcha: iPad versus ASP.NET. Giải pháp là để đưa những điều sau đây vào Page_Init trên mỗi trang web. Không phải là rất thanh lịch, nhưng nó hoạt động cùng với các bên trên:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    if (Request.UserAgent != null && Request.UserAgent.IndexOf("AppleWebKit", StringComparison.CurrentCultureIgnoreCase) > -1) 
    { 
     this.ClientTarget = "uplevel"; 
    } 
} 
+0

Cảm ơn @Avada Kedavra! Đã có cùng một vấn đề chính xác này, '' đã sửa nó. Nhiều đánh giá cao! Chưa đặt trong phần 'Page_PreInit', điều này chỉ có thể được đặt trên MasterPage cho phép nói để làm việc thông qua tất cả các trang? –

+0

@mcpDESIGNS: Tôi chưa thử điều đó nhưng quan tâm đến bất kỳ cách nào có thể làm cho giải pháp gọn gàng với ít mã hơn. Bạn có thành công với phương pháp bạn đề xuất không? –

+0

Tôi sẽ phải làm một số thử nghiệm khác trên đó và tôi sẽ cho bạn biết! Và tôi chỉ có nghĩa là đặt 'Page_PreInit' trên trang chính sẽ làm cho nó để bạn không phải sao chép/dán nó vào mỗi trang con. –

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