2012-04-20 28 views
5

Tôi đang thực hiện các lỗi tùy chỉnh trong ứng dụng MVC3 của tôi, nó bật trong web.config:Lỗi tùy chỉnh hoạt động cho HttpCode 403 nhưng không hoạt động với 500?

<customErrors mode="On"> 
    <error statusCode="403" redirect="/Errors/Http403" /> 
    <error statusCode="500" redirect="/Errors/Http500" /> 
</customErrors> 

điều khiển của tôi rất đơn giản, tương ứng với quan điểm đặt tên một cách chính xác:

public class ErrorsController : Controller 
{ 
    public ActionResult Http403() 
    { 
     return View("Http403"); 
    } 

    public ActionResult Http500() 
    { 
     return View("Http500"); 
    } 
} 

Để kiểm tra, Tôi đang ném ngoại lệ trong một trình điều khiển khác:

public class ThrowingController : Controller 
{ 
    public ActionResult NotAuthorised() 
    { 
     throw new HttpException(403, ""); 
    } 

    public ActionResult ServerError() 
    { 
     throw new HttpException(500, ""); 
    } 
} 

403 hoạt động - Tôi được chuyển hướng đến "/ Lỗi/Http403" tùy chỉnh của mình.

500 không hoạt động - Thay vào đó, tôi được chuyển hướng đến trang lỗi mặc định trong thư mục được chia sẻ.

Bất kỳ ý tưởng nào?

Trả lời

4

tôi đã có 500 lỗi và chạy bằng httpErrors ngoài các customErros tiêu chuẩn cấu hình:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="403" subStatusCode="-1" /> 
     <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" /> 
    </httpErrors> 
    </system.webServer> 

loại bỏ dòng này fro m global.asax

GlobalFilters.Filters.Add(new HandleErrorAttribute()); 

Tuy nhiên, không hoàn hảo vì tôi đang cố truy xuất lỗi cuối cùng luôn rỗng.

Server.GetLastError() 

Xem https://stackoverflow.com/a/7499406/1048369 cho phần toàn diện nhất về lỗi tùy chỉnh trong MVC3 Tôi đã tìm thấy sự trợ giúp tuyệt vời.

+1

Tôi muốn thứ hai này: Server.GetLastError có vẻ như te không thể phục hồi: ( –

0

Tôi đã có cùng một vấn đề, tôi bắt ngoại lệ trực tiếp trong Global.asax trong trường hợp đó:

protected void Application_Error(object sender, EventArgs e) 
     { 
      Exception exception = Server.GetLastError(); 

      Response.Clear(); 



      HttpException httpException = exception as HttpException; 

      var code = httpException == null ? 500 : httpException.GetHttpCode(); 

      // Log the exception. 
      if (code == 500) 
       logError.Error(exception); 

      Server.ClearError(); 

      Context.Items["error"] = code; 

      RouteData routeData = new RouteData(); 
      routeData.Values.Add("controller", "Error"); 
      routeData.Values.Add("action", "Index"); 
      routeData.Values.Add("code", code); 

      IController errorController = new ErrorController(); 
      errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 

     } 

Đó chuyển hướng đến Lỗi tùy chỉnh của tôi 500:?/Lỗi/Index code = 500

+0

Tôi không thể chấp nhận điều này làm câu trả lời ngay khi tôi nhận được nó hoạt động mà không cần sử dụng phương pháp Application_Error và thay vào đó sử dụng phần cấu hình httpErrors. Tôi sẽ đưa ra câu trả lời của bạn một +1 nhưng tôi chưa có đủ thông tin! Chúc mừng tho! – Nick

+0

Tất nhiên không có lý do gì mà httpErrors không hoạt động (được cấu hình tốt), giải pháp tôi sử dụng cho phép tôi kiểm soát nhiều hơn đối với các ngoại lệ uncatched – fmgp

+0

Đó là logic không hợp lệ để nói rằng nếu httpException là null thì một giả định sẽ được thực hiện là lỗi 500. Lỗi 500 phải được xác nhận bằng dữ liệu được thông qua bởi ngoại lệ. –

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