HTTP模块拦截请求并中断自定义错误配置

时间:2015-05-06 11:28:14

标签: asp.net asp.net-mvc azure iis-8.5 imageprocessor

我有一个ASP.NET MVC 5 Web应用程序,它在IIS 8.5上本地运行,在部署之后,在Azure网站上运行 - 在这两种情况下,稍后描述的行为都是相同的。

我在web.config中配置了以下自定义错误页面管理(它涵盖了我所有自定义错误的情况,并且已经过测试,并且工作正常):

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <clear />
    <error statusCode="400" responseMode="ExecuteURL" path="/App/Error"/>
    <error statusCode="403" responseMode="ExecuteURL" path="/App/Error/Forbidden" />
    <error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound" />
    <error statusCode="500" responseMode="ExecuteURL" path="/App/Error" />
  </httpErrors>
</system.webServer>

另外,我在同一个web.config中配置了一个HTTP模块,如下所示:

<system.webServer>
<modules>
  <add name="ImageProcessorModule" type="ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web" />
 </modules>
</system.webServer>

我遇到的问题是:如果我向.../c<这样的奇怪网址发出请求,应用程序会按照web.config文件中的指示执行500自定义错误路径。 但是,如果我向.../<c的陌生人URL(模拟html标签)发出请求,虽然结果错误是500,但自定义错误不再执行,因为相应的详细错误, HTTP模块拦截调用并“决定”只显示YSOD ...

我得到的信息是:

  

从客户端检测到潜在危险的Request.RawUrl值(=“/ app /

很容易看出这是由webmodule引起的,因为stacktrace:

  

[HttpRequestValidationException(0x80004005):从客户端检测到一个潜在危险的Request.RawUrl值(=“/ app / d__10.MoveNext()+201          System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+84          System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar)+98                          System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+434          System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+288

如果我正在从web.config中注释掉图像处理器模块,那么一切都按预期运行。

为什么在这种情况下,自定义错误路径不会被执行?

感谢您的时间和答案。

1 个答案:

答案 0 :(得分:4)

我非常强烈怀疑这是Image Processor中的错误。

Client Dependency(Umbraco的一个模块)中报告了完全相同的问题,虽然完全不相关,但它在请求管道的同一阶段访问Context.Request.RawUrl时类似。

您有两种选择: -

  1. 在不影响http模块行为的情况下找到设置runAllManagedModulesForAllRequests="false"的方法

  2. 查看您是否可以向https://github.com/JimBobSquarePants/ImageProcessor/blob/f4080c3217107eb7a571eb69e54cc5e69e1c892c/src/ImageProcessor.Web/HttpModules/ImageProcessingModule.cs提交补丁以使用Request.Unverified.RawUrl代替Request.RawUrl