我们刚刚升级到ASP.NET 4.0,发现requestValidation不再有效.MSDN文档建议我们需要将web.config中的requestValidationMode设置为2.0:
- 4.0(默认值).HttpRequest对象在内部设置一个标志,指示每当访问任何HTTP请求数据时都应触发请求验证.这保证了在请求期间访问诸如cookie和URL之类的数据之前触发请求验证.将忽略配置文件中的pages元素(如果有)或单个页面中的@ Page指令的请求验证设置.
- 2.0.仅对页面启用请求验证,而不是对所有HTTP请求启用.此外,配置文件中的pages元素(如果有)或单个页面中的@ Page指令的请求验证设置用于确定要验证的页面请求.
这对我们有用,但我有点困惑.似乎我们将其置于传统/兼容模式.当然应该可以有4.0行为,但仍然可以选择在页面上关闭它?
当我将HTML输入到表单中时,我的测试Web服务器上安装了.NET 4.0的应用程序出错了.我得到通常的错误:
从客户端检测到潜在危险的Request.Form值
这是由于.NET 4.0中的更改导致禁用关闭HTML输入的自动验证.我可以在我的本地开发机器上添加
<httpRuntime requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)
指向<system.web>我的根web.config部分的指令,然后.NET遵循<pages validateRequest="false" />同一根web.config中的指令.奇怪的是,我需要在本地计算机(版本5.1)上重新启动IIS才能使此更改生效.
当我将根web.config部署到我们的测试服务器时,我仍然得到验证错误.我尝试过使用run > iisreset,停止和启动IIS(测试服务器上的6.0版本),我甚至重新启动了服务器以完全清除.NET.我的应用程序肯定是拿起新的根web.config(我已经测试了这个),但是这个<httpRuntime requestValidationMode="2.0" />指令似乎只是被忽略了.
我的应用程序在我的本地计算机和测试服务器上配置为.NET 4.0应用程序.我已经尝试重建应用程序并将其重新部署到测试Web服务器.任何人都可以建议我需要做些什么来使这个工作?
谢谢,克里斯
我有一个自定义过滤器,我用了多年来以RequestValidationException更加用户友好的方式处理s.在我介绍区域之前,它在所有场景中都没有问题:
public class HandleHttpRequestValidationExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//base.OnException(filterContext);
if (!(filterContext.Exception is HttpRequestValidationException))
return;
const string viewName = "~/Views/Errors/HttpRequestValidationException.cshtml";
var result = new ViewResult
{
ViewName = viewName,
ViewData = { Model = filterContext.Exception.Message }
};
//result.ViewBag.StatusCode = 200;
filterContext.Result = result;
filterContext.RouteData.Values["area"] = "";
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 200;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Server.ClearError();
}
}
Run Code Online (Sandbox Code Playgroud)
...在FilterConfig中注册:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute()); …Run Code Online (Sandbox Code Playgroud)