繁体   English   中英

MVC 2和ASP.NET 4请求验证异常

[英]MVC 2 and ASP.NET 4 Request Validation Exception

我正在开发一个我从另一个开发商店继承的应用程序,我最近从MVC 1 / .NET 2 / 3.5升级到MVC2 / .NET 4。 除了一页外,一切正常。 在这个页面上有一个iframe,它加载了一个TinyMCE实例,并允许内联编辑一些HTML模板。 在托管页面上有一个连接到提交按钮的JavaScript事件,单击该视图时,抓取iframe的innerHtml值,将其转换为JSON,并将其放入隐藏的表单字段中。

作为表格帖我得到了臭名昭着的'一个有潜在危险的Request.Form值被检测到......“现在我跟着微软的白皮书并添加了

<httpRuntime requestValidationMode="2.0" />

到我的web.config和装饰我的控制器

[ValidateInput(false)]

我仍然得到这个错误。 相关的堆栈如下。

 [HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (HtmlContent="...orrectly? <a href=\"*|ARCHIVE|...").]
 System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8730676
 System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122
 System.Web.HttpRequest.get_Form() +114
 System.Web.HttpRequestWrapper.get_Form() +11
 System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request) +235
 System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) +119         
 System.Web.Mvc.<>c__DisplayClass11.<RunSelectionFilters>b__d(ActionMethodSelectorAttribute attr) +57
 System.Linq.Enumerable.All(IEnumerable`1 source, Func`2 predicate) +145
 System.Web.Mvc.ActionMethodSelector.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos) +524
 System.Web.Mvc.ActionMethodSelector.FindActionMethod(ControllerContext controllerContext, String actionName) +122
 System.Web.Mvc.ReflectedControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName) +182
 System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName) +47
 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +283
 System.Web.Mvc.Controller.ExecuteCore() +136
 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111
 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39
 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +65
 System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44
 System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42
 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +140
 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52
 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913
 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

有趣的是,如果我在Global.asax中挂钩BeginRequest方法,这似乎表明代码在2.0模式的请求验证下运行,因为如果我对.NET 4s请求验证的理解是正确的,我将无法做到如果代码在4.0验证模型下运行,则获取此方法,因为它在BeginRequest之前处理所有内容。

现在我能够通过从JavaScript函数调用隐藏表单字段值的escape()来避免这个问题,但显然,这是一个黑客行为。 有没有其他人遇到过这个问题,或者知道如何在我的控制器上正确禁用此方法的请求验证?

谢谢!

检查web.config中的“pages”部分是否如下所示:

<pages validateRequest="false" ...>...</pages>

如果没有尝试添加validateRequest属性。 这对我有用,因为几个月前我遇到了同样的问题。

编辑:哈哈,我没有看到它是如此老的帖子。 但我离开了我的衣服,因为它可能会帮助别人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM