Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC自定义错误页不存在';400个错误中的某些错误无法显示_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# ASP.NET MVC自定义错误页不存在';400个错误中的某些错误无法显示

C# ASP.NET MVC自定义错误页不存在';400个错误中的某些错误无法显示,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,对于新ASP.NET MVC应用程序的自定义错误页面管理,我遇到了一个非常有趣的问题 这个问题是这样的: -如果我在URL末尾使用“bad”参数调用一个URL(不管是哪一个),比如…/c,那么在IIS 7+中有很多错误信息和/或过时的错误处理解决方案。需要了解的主要内容有:- .NET4.0对ASP.NET的请求验证进行了重大更改 IIS 7+引入了一种处理自定义错误页面的新方法 大多数人都在使用hodge podge解决方案,涉及所有customErrors,httpErrors应用程序错

对于新ASP.NET MVC应用程序的自定义错误页面管理,我遇到了一个非常有趣的问题

这个问题是这样的:

-如果我在URL末尾使用“bad”参数调用一个URL(不管是哪一个),比如
…/c,那么在IIS 7+中有很多错误信息和/或过时的错误处理解决方案。需要了解的主要内容有:-

  • .NET4.0对ASP.NET的请求验证进行了重大更改
  • IIS 7+引入了一种处理自定义错误页面的新方法
大多数人都在使用hodge podge解决方案,涉及所有
customErrors
httpErrors
应用程序错误处理程序,并且经常在
httpRuntime
属性上设置
requestValidationMode=“2.0”
,和/或完全禁用请求验证!这使得使用他人的解决方案变得非常困难,因为所有这些都会影响行为。我快速搜索了一下,发现了几个没有被接受答案的半副本,可能是因为这个原因

这两个错误给您带来不同行为的原因是它们发生在请求管道的不同阶段。
web.config
中的
customErrors
节点与应用程序“内部”的错误交互,而请求验证在应用程序“外部”进行。IIS会在危险请求到达应用程序代码之前拒绝它,因此不会发生
customErrors
替换

那么我们如何解决这个问题呢

理想情况下,您需要一个具有尽可能少的运动部件的解决方案。IIS7为我们提供了一种在IIS级别而不是在应用程序级别指定错误页替换的新方法—
httpErrors
节点。这让我们可以在一个地方捕获所有错误:-

<configuration>
  ...
  <system.webServer>
    ...
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <error statusCode="400" responseMode="ExecuteURL" path="/ServerError.aspx"/>
      <error statusCode="403" responseMode="ExecuteURL" path="/ServerError.aspx" />
      <error statusCode="404" responseMode="ExecuteURL" path="/PageNotFound.aspx" />
      <error statusCode="500" responseMode="ExecuteURL" path="/ServerError.aspx" />
    </httpErrors>
    ...
  </system.webServer>
  ...
</configuration>
您应该完全删除
customErrors
节点。它通常用于向后兼容。您还应确保未在
httpRuntime
节点上设置
requestValidationMode

这将捕获大多数错误(显然,不包括解析web.config时的错误!)

相关:-

MSDN文件:-

注意:在您的情况下,如果要在
httpErrors
节点上设置
defaultPath
,则会因为
ApplicationHost.config
设置而导致锁冲突。您可以像我所做的那样,为您关心的错误代码单独设置
path
,也可以查看解锁节点:-

我的直觉是,在诸如Azure应用程序服务/Azure网站这样的低控制环境中,这会带来更多麻烦。您还可以为各个状态代码设置路径


我已经放了一本书。你也可以。

你在主持什么?卡西尼号?IIS6?IIS7+?iis8.5(windows8.1)和Azure网站。到目前为止,这是我多年来看到的最详细、最完美的回应。非常感谢你!!!它工作得很好!!!我又问了一个问题:似乎我已经在我的web.config中配置了一个HttpModule(ImageProcessorModule),它拦截了我的所有调用(这很正常),但是当我处理
时,从客户端检测到了一个潜在的危险请求。RawUrl值,我在明文中看到错误,没有显示500个自定义错误页面;不过,如果我对这个模块进行注释以不截获请求,我会看到自定义错误页面。。。我错过了什么?为什么系统不显示自定义错误消息,尽管web.config这么说?!非常感谢你!!!你最好将其作为一个单独的问题发布,并提供更多信息。我知道httpModules中的bug会导致自定义错误出现问题,但在缩小范围之前,我还需要做更多的工作。我会在几分钟内完成。非常感谢。完成:
this.Response.StatusCode = 500; // etc.