2011-06-23 38 views
10

Tôi đang cố gắng giải quyết vấn đề này. Trên máy cục bộ của tôi (Win7/VS2010/IIS 7.5) và một máy phát triển giống hệt, mã sau trả về mã trạng thái 500 và văn bản trả lời cho biết "Không thể định vị người dùng có địa chỉ email được chỉ định".Làm thế nào để trả lời đúng về lỗi trong ASP.NET MVC 3.0 qua JSON?

Khi tôi triển khai trang web vào máy chủ thử nghiệm của mình (Win2008 R2/IIS7.5), nó trả về mã trạng thái chính xác, nhưng loại nội dung được đặt thành "text/html" và responseText không chứa thông báo.

Tôi đã thử tắt các lỗi tùy chỉnh trên máy chủ, điều này không có sự khác biệt. Bất cứ ai có thể phát hiện ra vấn đề có thể là gì?

Tôi có một hình thức mà được cấu hình bằng cách sử dụng phương pháp AjaxHelper.BeginForm:

@using (Ajax.BeginForm("FindUser", new AjaxOptions {OnSuccess="findComplete", OnFailure="findFailed"}) 
{ 
    <fieldset> 
     @Html.EditorFor(m => m.UserEmail) 
     <div class="form-item button search"> 
      <input type="submit" value="Find"/> 
     </div> 
     <div id="find-err" class="message error hidden"> 
      <div class="contents"></div> 
     </div> 
    </fieldset> 
} 

Với một lỗi xử lý chức năng javascript:

function findFailed(result) { 
    var error = result.responseText; 
    if (error) { 
     $('#find-err .contents').text(error).slideDown(); 
    } 
} 

Hành động điều khiển bắt bất kỳ lỗi và trả về một thông điệp:

[HttpPost] 
public ActionResult FindUser(FindUserModel model) 
{ 
    try 
    { 
     // code to find user 

     if (user == null) 
     { 
      throw new Exception("Could not locate user with specified email address."); 
     } 

     if (Request.IsAjaxRequest()) 
     { 
      return Json(new { id = user.Id, name = user.Name }, JsonRequestBehavior.AllowGet); 
     } 

     model.FoundUser = user; 
     return View("Details", model); 
    } 
    catch (Exception ex) 
    { 
     if (Request.IsAjaxRequest()) 
     { 
      Response.StatusCode = 500; 
      return Json(ex.Message, JsonRequestBehavior.AllowGet); 
     } 

     ModelState.AddModelError("UserEmail", ex.Message); 
     return View(model); 
    } 
} 

Bất kỳ trợ giúp nào sẽ được đánh giá cao :)

Trả lời

15

Có vẻ như IIS đang ăn phản hồi và cố gắng làm công cụ sửa lỗi tùy chỉnh với nó.

Hãy thử thiết

Response.TrySkipIisCustomErrors = true 

trong nắm bắt của bạn.

Ngoài ra thiết lập giá trị cấu hình sau:

<httpErrors errorMode="Custom" existingResponse="PassThrough"/> 
+0

Nice one, đã không được coi là lỗi tùy chỉnh IIS nhận được trong cách. My HandleErrorsAttribute sets TrySkipCustomErrors, nhưng khi trực tiếp trả về trạng thái với một phản hồi JSON, tôi đã không thiết lập nó. –

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