2011-08-04 87 views
3

通過檢查我的elmah日誌,我看到我不斷收到「太長的url」請求。錯誤是:Asp.Net MVC:具有太長URL和錯誤處理請求

System.Web.HttpException (0x80004005): The length of the URL for this request exceeds the configured maxUrlLength value. 
    at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() 
    at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context) 

這裏是那種要求,我收到:

/index.php/blog/post/the_ten_deceptions_of_the_datetimepicker/+[PLM=0]+GET+http:/www .visualhint.com/index.php的/博客/後/ the_ten_deceptions_of_the_datetimepicker/+ [0,23778,23037] + - > + [N] + POST HTTP +:/www.visualhint.com/index.php/blog/post/ the_ten_deceptions_of_the_datetimepicker/+ [0,0,2007]

(不要驚訝於php的事情......在成爲一個asp.net mvc網站之前,我的網站當URL停在/index.php/blog/post/the_ten_deceptions_of_the_datetimepicker是PHP,現在我需要這種舊網址重定向到我新的URL格式,效果很好)

  1. 什麼能產生這些要求?它聽起來有惡意嗎?

  2. 我有自定義錯誤設置,所以我雖然這樣的請求將被重定向到我的自定義錯誤頁面,但事實並非如此。相反,人們會得到典型的黃色屏幕(螢火蟲提到這是一個400壞請求)。如果你看看上面的堆棧跟蹤,它非常短,異常似乎很早被捕獲(Application_BeginRequest甚至沒有被調用)。是否有可能顯示我的自定義錯誤頁面,或者我能否至少在發生這種異常時重定向到我的主頁?

我嘗試添加錯誤400線在我的web.config:

<customErrors mode="RemoteOnly"> 
    <error statusCode="400" redirect="/" /> 
</customErrors> 

這重定向到網頁的權利,但它增加了完整的URL在aspxerrorpath查詢字符串值。

感謝您的幫助。

+0

這裏的建議可能有幫助:http://stackoverflow.com/questions/1185739/asp-net-mvc-url-routing-maximum-path-url-length –

回答

1

谷歌搜索幫助我發現一些其他人得到了這種請求。有人回答說:

我很確定這是一種自動提交垃圾郵件的方式。必須有 在配置中出現錯誤,因爲它不應該在引薦來源字段中留下這樣一個多汁的蹤跡!

首先它告訴某個腳本獲得一個URL,然後它指示發送到 一個URL(它很容易阻止垃圾郵件直接發佈POST,而不是首先得到 )。

這些數字可能與要發佈的垃圾郵件有關(將其視爲垃圾郵件數據庫中的索引的 )。

因此,由於很有可能這些請求不是來自正常鏈接之後的人類,我最終得到了以下解決方案。這避免了污染我ELMAH日誌,這成爲一個空白頁給調用者有404碼:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    HttpException hExc = e.Exception.GetBaseException() as HttpException; 
    if (hExc != null) 
    { 
     if (hExc.ErrorCode == unchecked((int)0x80004005)) 
     { 
      e.Dismiss(); 
      return; 
     } 
    } 

    // Here I do some stuff if the error has to be logged. 
} 

void Application_Error(object sender, EventArgs e) 
{ 
    Exception exc = Server.GetLastError(); 
    HttpException hExc = exc as HttpException; 
    if (hExc != null) 
    { 
     if (hExc.ErrorCode == unchecked((int)0x80004005)) 
     { 
      Uri uri = HttpContext.Current.Request.Url; 

      Response.Clear(); 
      Response.StatusCode = 404; 
      Response.End(); 

      Server.ClearError(); 
     } 
    } 
} 

,而不是返回一個404碼的,我寧願不發送響應(呼叫者會有超時)但是它可能與asp.net?不知道...