2017-05-25 136 views
1

之後被稱爲我有一個路由設置這是做這個改寫:ValidateInputIfRequiredByConfig的Page_Load和Page_PreRender

<rule name="some Rule" patternSyntax="Wildcard"> 
    <match url="*" /> 
    <conditions> 
     <add input="{PATH_INFO}" pattern="/folder/*" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="/folder/details.aspx?url={PATH_INFO}" appendQueryString="true" /> 
</rule> 

而且我也有這樣的:

<httpRuntime targetFramework="4.6.1" maxUrlLength="256" /> 

我有一個機器人呼叫到一個無效的網址,是這樣的:

http://localhost:53649/route/Somefolder-Heres/W-ithsom-tet-Text-(An%C3%83%C6%92%C3%86%E2%80%99%C3%83%E2%80%A0%C3%A2%E2%82%AC%E2%84%A2%C3%83%C6%92%C3%A2%E2%82%AC%20%C3%83/MoreTExt-(%C2%A2%C3%A2%E2%80%9A%C2%AC%C3%A2%E2%80%9E%C2%A2%C3%83%C6%92%C3%86%E2%80%99%C3%83%C2%A2%C3%A2%E2%80%9A%C2%AC%C3%82%20%C3%83%C6%92%C3%82%C2%A2%C3%83%C2%A2%C3%A2%E2%82%AC%C5%A1%C3%82%C2%AC%C3%83%C2%A2%C3%A2%E2%82%AC%C5%BE%C3%82%C2%A2%C3%83%C6%92%C3%86%E2%80%99%C3%83%E2%80%A0%C3%A2%E2%82%AC%E2%84%A2%C3%83%C6%92%C3%82%C2%A2%C3%83%C2%A2%C3%A2%E2%82%AC%C5%A1%C3%82%C2%AC%C3%83%E2%80%A6%C3%82%C2%A1%C3%83%C6%92%C3%86%E2%80%99%C3%83%C2%A2%C3%A2%E2%80%9A%C2%AC%C3%85%C2%A1%C3%83%C6%92%C3%A2%E2%82%AC%C5%A1%C3%83%E2%80%9A%C3%82%C2%A1stasis)/someUrl(An%C3%83%C6%92%C3%86%E2%80%99%C3%83%E2%80%A0%C3%A2%E2%82%AC%E2%84%A2%C3%83%C6%92%C3%A2%E2%82%AC%20%C3%83%C2%A2%C3%A2%E2%80%9A%C2%AC%C3%A2%E2%80%9E%C2%A2%C3%83%C6%92%C3%86%E2%80%99%C3%83%C2%A2%C3%A2%E2%80%9A%C2%AC%C3%82%20%C3%83%C6%92%C3%82%C2%A2%C3%83%C2%A2%C3%A2%E2%82%AC%C5%A1%C3%82%C2%AC%C3%83%C2%A2%C3%A2%E2%82%AC%C5%BE%C3%82%C2%A2%C3%83%C6%92%C3%86%E2%80%99%C3%83%E2%80%A0%C3%A2%E2%82%AC%E2%84%A2%C3%83%C6%92%C3%82%C2%A2%C3%83%C2%A2%C3%A2%E2%82%AC%C5%A1%C3%82%C2%AC%C3%83%E2%80%A6%C3%82%C2%A1%C3%83%C6%92%C3%86%E2%80%99%C3%83%C2%A2%C3%A2%E2%80%9A%C2%AC%C3%85%C2%A1%C3%83%C6%92%C3%A2%E2%82%AC%C5%A1%C3%83%E2%80%9A%C3%82%C2%A1stasis)/

,從而P.NET拋出此異常

該請求的URL長度超過配置的 maxUrlLength值。

在System.Web.HttpRequest.ValidateInputIfRequiredByConfig()

在System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext的上下文)

我的問題是,從ValidateInputIfRequiredByConfig ASP.NET在之後我的Page_Load和Page_PreRender被稱爲。我可以解釋更多關於我在這裏做什麼,但我的問題是:

爲什麼ASP.NET在我的頁面執行後驗證URL?它沒有意義,爲什麼它浪費時間處理頁面,應該沒有更明智的做到這一點?有什麼方法可以改變這種行爲嗎?

我上傳Github上演示: 所以,你可以下載這個解決方案https://github.com/kblok/StackOverflowExamples/tree/master/AspNetDemoProject

並打破In the page load,然後在 Error module。你會看到PageLoad首先被擊中。

+0

看這個鏈接https://msdn.microsoft.com/en-us/library/bb470252.aspx#Life%20Cycle%20Stages看起來'驗證請求'是甚至在URL映射之前執行的第一步,提高'BeginRequest'事件等等。你確定首先執行了「Page_Load」嗎?你確定它是爲了SAME請求而執行的嗎? –

+0

是@VivekAthalye我有一個錯誤模塊,所以我添加了3個斷點:在Load,PreRender和該模塊中,錯誤在Load和PreRender之後。我會嘗試上傳一段代碼 – hardkoded

+0

是否有可能您的「Page_Load」和其他事件得到正確執行,導致某種「響應」。重定向「,並在新請求開始時導致錯誤? –

回答

0

此基礎上,你在我的理解的評論所提到的點是

  1. 你的頁面details.aspx是越來越有查詢字符串PARAM url=<path with unicode characters>訪問。
  2. Page_Load您的代碼檢查請求,發現它的無效並將用戶重定向到新的URL。
  3. 而且這個新網址超過允許的最大長度長,所以你得到The length of the URL for this request exceeds the configured maxUrlLength value.

原始請求URL的lengh是限制範圍內,所以沒有錯誤Page_Load之前。

+0

這不是先生,我只是用演示項目更新了這個問題。 – hardkoded