2012-01-17 59 views
17

Tôi đang xây dựng một ứng dụng MVC 3 với phần phụ trợ IIS 7.5. Trên bộ điều khiển của tôi, tôi có các phương thức hành động cho phép người dùng thêm/chỉnh sửa các đối tượng miền. Hành động xử lý HTTP Post, có một giá trị trả về của chuỗi chứa bất kỳ thông báo lỗi xác thực nào gặp phải trong quá trình lưu. Dưới đây là một ví dụ về một phương pháp hành động:IIS ghi đè văn bản phản hồi HTTP khi trạng thái phản hồi HTTP được đặt là 400

[HttpPost] 
    public string CustomerEdit(CustomerModel customerModel) 
    { 
     var errorMessages = new StringBuilder(); 
     var serverErrors = new List<string>(); 

     //Map to a customer domain object 
     Mapper.CreateMap<CustomerModel, Customer>(); 
     var customer = Mapper.Map<CustomerModel, Customer>(customerModel); 

     if (customerModel.Oper == "del") 
     { 
      var customerIds = new List<Guid>(); 
      customerIds.Add(customer.Id); 

      if (!_serverService.DeleteCustomers(customerIds)) 
      { 
       errorMessages.Append("The item could not be deleted"); 
       Response.StatusCode = Constants.STATUS_SERVER_ERROR; 
      } 
     } 
     else 
     { 
      //Validate 
      if (!_serverService.ValidateCustomer(customer, out serverErrors)) 
      { 
       foreach (var error in serverErrors) 
       { 
        ModelState.AddModelError("Validation", error); 
       } 
      } 

      //Save 
      if (ModelState.IsValid) 
      { 
       var saveStatus = _serverService.SaveCustomer(ref customer, _id); 

       if (!saveStatus) 
       { 
        errorMessages.Append("The server encountered and error during Save"); 
        Response.StatusCode = Constants.STATUS_SERVER_ERROR; 
       } 
      } 
      else 
      { 
       errorMessages.Append(GetValidationErrors(ModelState)); 
       Response.StatusCode = Constants.STATUS_SERVER_ERROR; 
      } 
     } 
     return errorMessages.ToString(); 
    } 

Trong trường hợp của một lỗi, tôi cần phải thiết lập thuộc tính Response.StatusCode đến một giá trị của một trong hai 400/500, và trả về một chuỗi nối các thông báo lỗi chi tiết . Thật không may, IIS luôn xóa chuỗi lỗi của tôi trong bài kiểm tra phản hồi và (trong trường hợp có 400 lỗi), hãy thêm thay thế bằng chuỗi 'Yêu cầu không hợp lệ'

Có cách nào để định cấu hình IIS để trả về tùy chỉnh, Tác vụ hay không -specific, chuỗi khi mã trạng thái được đặt thành 400?

Trả lời

17

Sau khi nói chuyện với một người bạn của tôi là người một Wiz tại cấu hình IIS, tôi thấy rằng trong IIS 7+ bạn có thể thêm dòng sau vào web.config:

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

Nếu thiết lập này trong web.config được sử dụng, VÀ bạn thiết lập cơ thể của phản ứng, sau đó cơ thể phản ứng sẽ tiếp cận khách hàng. Nếu bạn KHÔNG thiết lập phần thân phản hồi, thì IIS sẽ phục vụ một trang lỗi chi tiết với thông tin lỗi chi tiết (xem http://learn.iis.net/page.aspx/267/how-to-use-http-detailed-errors-in-iis/). Nhiều người cho rằng đây là một nguy cơ bảo mật, vì vậy hãy thận trọng khi sử dụng.

0

Ít nhất trang Configuring HTTP Error Responses in IIS 7 nói

Note

Bạn không có thể tùy chỉnh các thông điệp sau Lỗi HTTP: 400, 403,9, 411, 414, 500, 500,11, 500,14, 500,15, 501 , 503 và 505.

CHỈNH SỬA: mặc dù trong phản hồi của this question, trông khá giống nhau, có một phản hồi xác nhận quyền sở hữu thứ ít nhất một cái gì đó có thể được thực hiện với cấu hình httpErrors.

+0

Tôi đã tìm thấy cách để thực hiện việc này, vui lòng xem câu trả lời của tôi để biết chi tiết – TheoryOfLight

13

Trong MVC, bạn cũng có thể thực hiện điều này trên cơ sở Hành động theo hành động. Xem TrySkipisCustomErrors.

Sử dụng:

Response.TrySkipIisCustomErrors = true; 
Response.StatusCode = (int)HttpStatusCode.BadRequest; 
return this.Json(SomeJsonObject); // could output string too 
+0

Nó đã giúp tôi. Tôi đã sử dụng nó với mã trạng thái 422 (không được thử với 400) –

1

chúng tôi đã kết thúc với đi cho

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="PassThrough"> 
</system.webServer> 

trong web.config. Cho phép lỗi tùy chỉnh đã đặt mã trạng thái để rời khỏi IIS không được đánh dấu.

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