2013-04-17 60 views
3

目前正在ASP.NET中爲我的網站設計錯誤頁面。如果服務器無法找到請求的頁面,我正在使用Web配置文件將用戶重定向到錯誤頁面。下面是我在配置文件中使用的customErrors標籤:在不重寫URL的情況下顯示自定義ASP.NET錯誤頁面

<customErrors mode="On" defaultRedirect="~/ErrorPages/Error.aspx"> 
    <error statusCode="404" redirect="~/ErrorPages/Error.aspx"/> 
</customErrors> 

它目前的工作,但我的問題是,我不希望用戶看到我的錯誤頁面的URL爲顯示如下:

/MySite/ErrorPages/Error.aspx?aspxerrorpath=/MySite/ImaginaryPage.aspx

我期待着什麼像什麼谷歌有: Google Error Page

有沒有辦法做到這一點沒有JavaScript?

+0

我想這可能會提供一些有用的指針在ASP.NET錯誤處理:http://stackoverflow.com/a/14755859/1236044 – jbl

回答

3

這篇文章可以幫助你出去,這裏是它的一個片段: http://blog.dmbcllc.com/aspnet-application_error-detecting-404s/

void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    if (ex is HttpException) 
    { 
     if (((HttpException)(ex)).GetHttpCode() == 404) 
      Server.Transfer("~/Error404.aspx"); 
    } 
} 

真的這樣做的關鍵部分是,如果你想保持相同的URL請求的,那麼Response.Redirect被不是你想要的,因爲它返回到客戶端發出第二個請求,從而更改URL。您想保留在服務器上,因此適當的呼叫將是Server.Transfer。這個特定的事件處理程序進入你的Global.asax.cs文件,並且該方法將在應用程序上下文中關聯的任何404s上升。

不幸的是,它會跳過您的customErrors配置部分,並依賴更多的編程方法,但是從維護角度來看代碼非常簡單。

+0

+1好東西,非常有用!這會保留錯誤的URL,而不是將其更改爲'/ Error404.aspx'或whatnot。然而,我正在使用'ASP.NET MVC 5'和'Server.Transfer' *不工作......'Server.TransferRequest' * does *工作,但只能被調用一次(在上面的鏈接中, 'Server.Transfer'方法被調用兩次)。 –

+3

季節的問候! System.Web.Routing使現在變得更容易了。顯然,這是MVC的基礎,所以你可以寫一條全面的路線並完成。您也可以在WebForms中使用路由。看看這個鏈接:http://stackoverflow.com/questions/310580/how-can-i-make-a-catch-all-route-to-handle-404-page-not-found-queries-for-asp – Scott

+0

乾杯@Scott!我實際上使用了兩種技術 - 同時使用'Application_Error'和一條全路徑。事實上,我發現我的'Application_Error'方法在沒有catch-all路由的情況下* not *工作。使用兩者的改進似乎是URL保持其「無效狀態」。現在要弄清楚Google如何捕獲並顯示無效的URL ......這是一個鏈接:http://blog.dmbcllc.com/404-errors-retrieving-the-bad-url/ –

相關問題