2011-09-17 36 views
6

Tôi đã phát triển một ứng dụng web trên máy cục bộ của mình trong một vài ngày bằng cách sử dụng Visual Studio 2010. Tối qua tôi đã triển khai ứng dụng của mình trên IIS 7 và bực dọc trên một stopper hiển thị chính. Vấn đề có liên quan đến xử lý lỗi trong yêu cầu Ajax. Để bắt đầu, tôi có một số màn hình chỉnh sửa hoạt động theo yêu cầu ajax. Đây là phần ajax của màn hình chỉnh sửa Ajax.Nghi ngờ liên quan đến xử lý lỗi trong các yêu cầu Ajax trong ASP.net MVC

@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content", 
                  LoadingElementId="imgSaveLoading", OnFailure="onError", 
                  OnSuccess = "onSuccess" }, new { id = "frmCity" })) { 
    <img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" /> 
    <div class="content" id="content"> 
     @{Html.RenderPartial("_CityEdit");} 
    </div> 

    <!-- Some Other code here --> 
} 

Tôi đã dựa vào cuộc gọi lại "onError" của Ajax.BeginForm(). Vì vậy, trong bộ điều khiển của tôi, bất cứ khi nào tôi muốn hiển thị lỗi cho người dùng (lỗi mô hình hoặc bất kỳ lỗi nào khác), tôi chỉ đặt Phản hồi của máy chủ thành 500 (Lỗi Máy chủ Nội bộ) một cách lạc quan hy vọng rằng điều này sẽ dẫn đến xử lý "OnError" của Ajax.BeginForm() được gọi. Đây là một đoạn của cách tôi đã làm điều này trong bộ điều khiển của tôi.

[HttpPost] 
public ActionResult _CityEdit(CityViewModel viewModel) { 
    city = cityManager.FindCity(viewModel.City.Id, false); 
    // Validate Model here 
    if (!TryUpdateModel(city, "City")) { 
     Response.StatusCode = 500; 
     return PartialView("_CityEdit", viewModel); 
    } 

Như có thể thấy từ mã trên, tôi đã trả về PartialView và nếu có chứa Lỗi mô hình, chúng sẽ tự động được hiển thị trên màn hình chỉnh sửa Ajax. Sau đó, trong JavaScript "OnError" tôi chỉ cần thay thế div liên quan với PartialView trả về bởi controller như thế này.

function onError(xhr) { 
    $('#content').html(xhr.responseText); 
} 

Tất cả đều hoạt động tốt trên máy phát triển của tôi. Khi tôi triển khai ứng dụng của mình trên IIS 7 và truy cập nó từ một hộp Windows XP (với IE 8 hoặc Chrome), thay vì PartialView, các trình duyệt chỉ hiển thị màn hình "500 Lỗi Máy chủ Nội bộ" mặc định. Vì vậy, tôi có một vài nghi ngờ khiến tôi không ngủ ngon đêm qua.

  1. Cách tiếp cận mà tôi đã sử dụng để chỉnh sửa Ajax là hợp lý. Nếu không phải những gì có thể là cách khác (s) tôi có thể đã xử lý Ajax Editing (với khả năng hiển thị lỗi mô hình).

  2. Vì tôi đã phát triển các mô-đun này trong một vài ngày và đã nỗ lực đáng kể, có bất kỳ công việc nào xung quanh để làm cho nó hoạt động trên hộp XP hay không. Về cơ bản, nó sẽ là lý tưởng nếu tôi bằng cách nào đó có thể ngăn chặn trình duyệt hiển thị màn hình "500 Lỗi máy chủ nội bộ" mặc định của họ.

  3. Là cách tiếp cận này làm việc trên cửa sổ 7, bởi vì tôi có IIS 7 được cài đặt trên các cửa sổ cùng 7 máy mà tôi đang sử dụng để duyệt đến trang web, hoặc nó chỉ là nó hoạt động tốt với các cửa sổ 7.

Nếu có bất kỳ đề xuất nào khác, vui lòng tiếp tục.

Chỉnh sửa: Tôi đã tìm được giải pháp cho sự cố của mình. Vì vậy, điều đó có nghĩa là nghi ngờ không có 2 và 3 được trả lời. Về cơ bản, mục nhập sau trong web.config ngăn trình duyệt hiển thị các trang trình duyệt mặc định cho trang web.

<system.webServer> 
     <httpErrors errorMode="Detailed"/> 
    </system.webServer> 

Nhưng điều đó vẫn để lại nghi ngờ đầu tiên của tôi. Tôi đã sử dụng cách tiếp cận hợp lý để chỉnh sửa Ajax chưa?


Tôi đã kiểm tra phản hồi với người chơi và IIS đã gửi trang lỗi mặc định cho lỗi Máy chủ 500. Vì vậy, cần phải định cấu hình để trả về phản hồi "Chi tiết". Chúng ta có thể làm điều này bằng cách sử dụng trình quản lý IIS. Một tùy chọn khác mà tôi đang theo dõi là xác định nó ở cấp ứng dụng trong tệp web.config của ứng dụng.

Tuy nhiên, tôi lại gặp khó khăn khi đi theo phương pháp này hoặc để làm lại toàn bộ ứng dụng của mình. Vấn đề xảy ra là nếu thực sự có một số mô-đun bị lỗi với 500 Máy chủ nội bộ, mã của tôi bị lộ trong trình duyệt vì errorMode được đặt thành "Chi tiết". Vì vậy, tôi cần một số cách để cung cấp phản hồi tùy chỉnh của mình khi tôi đặt mã lỗi phản hồi thành 500 và nếu bất kỳ phần nào khác của ứng dụng không thành công (tôi không phải là cài đặt 500 mã trạng thái) thì trang lỗi mặc định sẽ được gửi thay vì hiển thị mã của tôi thông qua phản hồi "Chi tiết". Xin vui lòng giúp đỡ.

liên quan, NIrvan.

+0

Lạ mà chi tiết (hoặc RemoteOnly và bạn đang ở xa.) các trang lỗi sẽ giải quyết được vấn đề của bạn. Bạn có nghĩa là toàn bộ trang đã được thay thế bằng màn hình lỗi, thay vì div nội dung? Điều đó cũng cập nhật URL hiện tại trong trình duyệt? Điều đó nghe có vẻ giống như cuộc gọi AJAX không thành công, bởi vì nó sẽ không bao giờ dẫn đến một GET/POST bình thường - nó sẽ chỉ hiển thị thông qua JS. Tôi nghĩ rằng kỹ thuật của bạn là chấp nhận được vì bạn không bao giờ có thể bảo vệ chống lại 500s từ các cuộc gọi AJAX * anyway * - 'OnError' phải đủ để xử lý chúng. Tôi nghĩ bạn nên khai thác nguyên nhân của 'OnError' không hoạt động trong môi trường được triển khai trước. – bzlm

+0

@bzlm, tôi khá chắc chắn rằng trình duyệt đã bỏ qua toàn bộ phản hồi mà tôi đã trả về từ bộ điều khiển cho yêu cầu ajax đã cho khi tôi đặt trạng thái phản hồi thành 500. Bằng cách nào đó, trình duyệt hiển thị màn hình "500 Lỗi Máy chủ Nội bộ" của chính nó. Nhưng bạn đã đúng rằng nội dung của div nội dung đã được thay thế bằng trang "500 Lỗi Máy chủ Nội bộ". Các phần khác của trang html của tôi vẫn giữ nguyên như trước. Nhưng vẫn còn, tôi đã phải ngăn chặn trình duyệt từ poping trang lỗi của nó và thực sự là "errorMode" giải quyết vấn đề. Tôi đã không thay đổi bất cứ điều gì khác trong ứng dụng của tôi (theo như tôi biết). Cảm ơn. – Jatin

+0

@ bzlm, đây là nơi tôi tìm ra giải pháp. http://www.bala-krishna.com/how-to-disable-500-internal-server-error-on-godaddy-windows-hosting/ – Jatin

Trả lời

0

mới trong IIS 7: bạn phải thiết lập HttpResponse.TrySkipIisCustomErrors true để ghi đè lên các thiết lập trang Lỗi IIS nếu customErrors của web.config của bạn được thiết lập để vào Xem this answer

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