【问题标题】:ValidateInputIfRequiredByConfig being called after Page_Load and Page_PreRender在 Page_Load 和 Page_PreRender 之后调用 ValidateInputIfRequiredByConfig
【发布时间】:2017-05-25 11:15:34
【问题描述】:

我有一个正在执行此重写的路由设置:

<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" />

我有一个机器人调用了一个无效的 url,比如:

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)/

所以 ASP.NET 抛出了这个异常

此请求的 URL 长度超过了配置的 maxUrlLength 值。

在 System.Web.HttpRequest.ValidateInputIfRequiredByConfig()

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

我遇到的问题是来自 ASP.NET 的 ValidateInputIfRequiredByConfig 在我的 Page_Load 和 Page_PreRender 之后被调用。我可以解释一下我在这里做什么,但我的问题是:

为什么 ASP.NET 在我的页面执行后验证 URL?没有意义,为什么要浪费时间处理页面,以前这样做不应该更有意义?有没有办法改变这种行为?

我在 Github 上上传了一个演示: 所以你可以下载这个解决方案https://github.com/kblok/StackOverflowExamples/tree/master/AspNetDemoProject

然后打破In the page load,然后在 Error module。您会看到首先点击 PageLoad。

【问题讨论】:

  • 查看此链接msdn.microsoft.com/en-us/library/… 似乎Validate the request 是在URL 映射、引发BeginRequest 事件等之前执行的第一步。你确定Page_Load 是先执行的吗?您确定它会针对 SAME 请求执行吗?
  • 是的@VivekAthalye 我有一个错误模块,所以我添加了 3 个断点:在加载、PreRender 和该模块中,在加载和 PreRender 之后到达错误。我试试上传一段代码
  • 您的Page_Load 和任何其他事件是否有可能正确执行导致某种Response.Redirect 并在新请求开始时导致错误?
  • 是的,我在 Page_Load 上重定向,因为 URL 无效,并且我的错误模块(在页面加载后调用)中的 Server.TransferRequest 不起作用。我希望页面在我的页面加载之前失败。
  • @VivekAthalye 演示项目上传

标签: asp.net validation


【解决方案1】:

根据您在 cmets 中提到的要点,我的理解是

  1. 您的页面details.aspx 正在使用查询字符串参数url=&lt;path with unicode characters&gt; 进行访问。
  2. Page_Load 中,您的代码检查请求,发现其无效并将用户重定向到新 URL。
  3. 而且这个新 URL 的长度超过了允许的最大长度,所以你会得到 The length of the URL for this request exceeds the configured maxUrlLength value.

原始请求 URL 的长度在限制范围内,因此Page_Load 之前没有错误。

【讨论】:

  • 不是那个先生,我刚刚用一个演示项目更新了问题。
猜你喜欢
  • 2012-01-21
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多