2010-04-20 178 views
2

我正在研究一個大型Web應用程序,我最近從項目中擱置了大量的.aspx頁面ASP.NET請求擴展類型

爲了避免頁面未找到錯誤,我在xml中添加了這些實體,其數量大約在300+以上。我編寫了一個http模塊,用於檢查xml實體中的請求url,如果發現它們,我的模塊將把請求重定向到相應的新頁面。

一切都很正常,但我的收藏是越來越重複的所有請求,我的意思是每一個.JPG,的.css,.js文件,.ICO,.PDF等

有什麼對象或屬性,可以告訴用戶請求的請求的類型,如HttpContext.request.type。這樣我可以避免檢查所有不需要的文件類型的請求。

+0

您運行的是哪個版本的IIS? – David 2010-04-20 21:52:46

回答

1

您可以使用HttpContext.Current.Request.FilePath屬性獲取當前請求的虛擬路徑。

例如,對於URL http://www.contoso.com/virdir/page.html/tailFilePath的值爲/virdir/page.html

第二步是獲取擴展本身。例如,您可以使用System.IO.Path.GetExtension方法來執行此操作。對於/virdir/page.html路徑,它將返回.html擴展名。

1

您可以改爲捕獲404錯誤以避免攔截每個頁面請求。將Application_Error方法添加到您的global.asax中,如下所示。如果頁面不是您需要根據您的XML文件重定向的頁面,這將允許您也重定向到一個特殊的錯誤頁面。

protected void Application_Error(object sender, EventArgs e) 
{ 
    Log.Error("*** Application_Error ***"); 

    Exception baseException = Server.GetLastError().GetBaseException(); 

    HttpException httpException = baseException as HttpException; 
    if (httpException != null) 
    { 
     int httpCode = httpException.GetHttpCode(); 
     Log.ErrorFormat("HTTPEXCEPTION: {0} : {1}", httpCode, HttpContext.Current.Request.RawUrl); 
     if (httpCode == 404) 
     { 
       ... 
1

另一種方法是使用ASP.NET路由(從.NET 3.5開始)創建將每個舊頁面映射到新頁面處理程序的路由。 ASP.NET路由可以讓一個ASPX頁面擁有多個Url,並且實際上可以完全隱藏最終用戶的.ASPX,並且可以爲您的所有頁面提供搜索引擎友好的Url。如果您將多個網址映射到一個網頁上,則您需要在網頁上放置規範網址標記。

或者

如果你想重定向你可以用一個簡單的重定向路由處理這樣的註冊路線: -

routes.Add(new Route("sample.aspx", new RedirectRouteHandler("/home/newsample.aspx"))); 

而且RedirectRouteHandler可能是這個樣子: -

/// <summary> 
    /// Redirect Route Handler 
    /// </summary> 
    public class RedirectRouteHandler : IRouteHandler 
    { 

    private string newUrl; 

    public RedirectRouteHandler(string newUrl) 
    { 
     this.newUrl = newUrl; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new RedirectHandler(newUrl); 
    } 
} 

/// <summary> 
/// <para>Redirecting MVC handler</para> 
/// </summary> 
public class RedirectHandler : IHttpHandler 
{ 
    private string newUrl; 

    public RedirectHandler(string newUrl) 
    { 
     this.newUrl = newUrl; 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext httpContext) 
    { 
     httpContext.Response.Status = "301 Moved Permanently"; 
     httpContext.Response.StatusCode = 301; 
     httpContext.Response.AppendHeader("Location", newUrl); 
     return; 
    } 
} 
+0

我已經有了這些路線。我需要這些路線的重定向。 – Krishna 2010-04-21 02:07:58

+0

如果您不想將它們映射到同一頁面(正如我所建議的那樣),您可以隨時註冊一個重定向路由處理程序,如我的編輯中所示。 – 2010-04-21 05:15:09