2011-09-01 29 views
10

Tôi có tùy chỉnh các trang lỗi cài đặt sử dụngMVC InvalidOperationException với các trang lỗi tùy chỉnh

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/PageNotFound" /> 
</customErrors> 

Tôi tạo ra một trang mà ném và ngoại lệ và tôi được chuyển đến các trang báo lỗi chính xác.

Tuy nhiên tôi nhận thấy những sai sót trong ELMAH trên máy chủ web sản xuất:

System.InvalidOperationException Quan điểm 'Lỗi' hoặc thạc sĩ của nó được không tìm thấy hoặc không có công cụ xem hỗ trợ các địa điểm khám xét. Các địa điểm được tìm kiếm: ~/Khu vực/Bóng đá/Lượt xem/Dự thảo/Lỗi.aspx ~/Khu vực/Bóng đá/Lượt xem/Bản nháp/Lỗi.ascx ~/Khu vực/Bóng đá/Lượt xem/Chia sẻ/Lỗi.aspx ~/Khu vực/Bóng đá/Lượt xem/Chia sẻ/Lỗi.ascx ~/Lượt xem/Bản nháp/Lỗi.aspx ~/Lượt xem/Nháp/Lỗi.ascx ~/Lượt xem/Chia sẻ/Lỗi.aspx ~/Lượt xem/Chia sẻ/Lỗi. ascx ~/Khu vực/Bóng đá/Lượt xem/Bản nháp/Lỗi.cshtml ~/Khu vực/Bóng đá/Lượt xem/Bản nháp/Lỗi.vbhtml ~/Khu vực/Bóng đá/Lượt xem/Chia sẻ/Lỗi.cshtml ~/Khu vực/Bóng đá/Lượt xem /Shared/Error.vbhtml ~/Lượt xem/Nháp/Lỗi.cshtml ~/Lượt xem/Nháp/Lỗi.vbhtml ~/Lượt xem/Chia sẻ/Lỗi.cshtml ~/Lượt xem/Chia sẻ/Lỗi.vbhtml

Tại sao tìm trang lỗi ở nơi khác? Tôi đã xóa ~/Views/Shared/Error.cshtml và thêm trang lỗi tùy chỉnh của tôi tại ~/Home/Error vì tôi đã chỉ định một mặc định mới trong tệp cấu hình của mình.

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

Cảm ơn.

+0

Từ 'customErrors' là một cái gì đó giao dịch với ASP.NET (không ASP .NET MVC), nó không phải là công cụ tốt nhất cho công việc. Richard Dingwall có một bài viết tuyệt vời về điều này: http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/ –

Trả lời

26

dự án MVC theo mặc định thêm HandleErrorAttribute trong Global.asax.cs tập tin

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

Bộ lọc này được thực thi khi một ngoại lệ unhandled được ném. Nó đặt chế độ xem là Error. Do đó thời gian chạy MVC cố gắng hiển thị chế độ xem đó. Nhưng trong trường hợp của bạn, không có cái nhìn như vậy. Vì vậy, nó lại ném một ngoại lệ khác được xử lý bởi ASP.NET runtime và hiển thị trang lỗi của bạn mà bạn đã cấu hình trong tập tin Web.Config.

Bạn có thể tạo bộ lọc ngoại lệ của riêng mình và đăng ký bộ lọc.

+0

Cảm ơn bạn đúng rằng dường như chính xác những gì đang xảy ra. Tôi đã đặt chế độ xem lỗi mặc định trở lại và đã ném ngoại lệ, lỗi đó về việc không tìm thấy chế độ xem mặc định đã biến mất. Tuy nhiên elmah không đăng nhập ngoại lệ. Tôi tốt với việc sử dụng chế độ xem mặc định, nhưng làm thế nào đến elmah không đăng nhập các lỗi? Nó ghi nhật ký 404 tốt, nhưng không phải là lỗi máy chủ 500. –

+2

@Aros - Bạn cần triển khai phiên bản đặc biệt của HandleErrorAttribute cho Elmah. Bạn có thể tìm thấy một exmaple ở đây: http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx –

+0

Cảm ơn bây giờ tôi đã nhận xét ra dòng trong câu trả lời, và đang dựa vào chuyển hướng lỗi tùy chỉnh từ web.config. Tôi sẽ sử dụng câu trả lời ở đây nếu điều đó gây ra vấn đề. http://stackoverflow.com/questions/766610/how-to-get-elmah-to-work-with-asp-net-mvc-handleerror-attribute/779961#779961 Bất cứ ai cũng biết tại sao tôi không muốn bình luận dòng mã đó ra sao? –

5

Tôi đã kết thúc việc đăng ký HandleErrorAttribute trong Global.asax và chỉ sử dụng phần <customErrors>. Hiện tại, ELMAH đã ghi lại các lỗi và tôi có thể chỉ định các trang lỗi tùy chỉnh.

Tôi có thiếu gì đó không?

+0

Dường như làm việc cho tôi, làm tôi hơi lo lắng nhưng không thấy có gì sai trái. – andrewb

+0

Làm việc cho tôi bằng cách sử dụng các lỗi tùy chỉnh với StackExchange.Exception thay vì Elmah. – Gareth

0

Đối với người đọc trong tương lai của bài đăng này, lưu ý rằng Elmah thêm HandleErrorAttribute riêng của mình vì vậy cũng mong đợi chế độ xem Error.cshtml. Lưu ý rằng tôi cũng đã cài đặt gói Elmah.MVC NuGet nhưng nó chỉ được sử dụng để cài đặt nó đúng cách.

Vâng, chỉ thấy trên nuget.org rằng Elmah.MVC chịu trách nhiệm cho việc thêm các HandleErrorAttribute:

hội nhập không đau chức năng ELMAH vào ASP.NET MVC Application. Chỉ cần thả gói bên trong ASP của bạn.Ứng dụng NET MVC và truy cập/URL elmah. Nó cũng sẽ cài đặt bộ lọc HandleError toàn cầu, đảm bảo tất cả các lỗi chưa được xử lý được ghi lại (ngay cả khi customError được bật "Bật").

1

Bạn cũng có thể chắc chắn rằng HandleErrorAttribute không được đăng ký bằng cách loại bỏ nó ra khỏi bộ lọc toàn cầu, bằng cách sử dụng phương pháp Remove:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Remove(new HandleErrorAttribute()); 
     /* ... your other filters */ 
    } 
} 
Các vấn đề liên quan