1

不确定这是否是问这个问题的正确地方,但我在使用 MVC5 在字符串中发布 HTML 时遇到了一个问题。问题是:一旦控制器被请求击中并且要发送响应,ASP.NET MVC 框架中还有什么可能触发如下验证错误?

从客户端检测到具有潜在危险的 Request.Form 值(messagebody="

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[HttpRequestValidationException (0x80004005):从客户端 messagebody=" html tags here " 中检测到潜在危险的 Request.Form 值。System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +12339710
System.Web.HttpValueCollection.Get(String name) +90
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(String path, HttpVerb verb, HttpContext context , CachedVary cachedVary) +956 System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) +1212
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92 System.Web.HttpApplication.ExecuteStep (IExecutionStep 步骤,Boolean& completedSynchronously)+165

我知道 ASP.NET MVC 中的内置请求验证,并且我已使用属性注释了我的视图模型的属性[AllowHtml],如下所示:

public class MyClassVM 
{
  [AllowHtml]
   public string MessageBody { get; set; }
}

..所以到达控制器动作并反序列化为对象没有问题。然后在我的控制器的操作中,我让框架将发布的消息的内容反序列化为 MyClassVM 实例,如下所示:

[HttpPost]
 public ActionResult Details(NotificationVM notificationVm)
 {
     if (ModelState.IsValid)
     {
         string messageBody = notificationVm.MessageBody; 
         //do things like saving something in DB. This works good!
     }
     var serverError = Server.GetLastError(); //null. No errors at this point
     return new HttpStatusCodeResult(HttpStatusCode.OK);
}

然而,该private void Application_Error(object sender, EventArgs e)方法已达到和 Server.GetLastError(); 由于请求中的 html 代码,在该阶段包含验证异常。

为什么?一旦控制器几乎完成了它的工作,什么可能触发验证错误?它可能是响应中间的过滤器中的东西吗?(有一些过滤器,但它们看起来非常基本的身份验证过滤器,另一个修改 Json 序列化程序以替换某些日期(如果有的话)。)。

同样在调试时,我能看到的最后一个代码是一些可以访问 System.Security.Principal.IIdentity 的属性,但我不明白这可能是个问题..

更新:我尝试在控制器操作的顶部添加 [ValidateInput(false)] 但这没有任何区别。还检测到潜在危险的 Request.Form 值并触发异常。

更新:我还尝试禁用在控制器被击中之前正在执行的自定义模型绑定器。但是没有运气,问题一定是在控制器的操作执行之后发生的其他事情,并且从已经反序列化的发布的视图模型中正确读取了字段。

谢谢

4

1 回答 1

0

它与作为 MVC 框架一部分的 ModelState 验证有关。感谢这篇文章,我了解了它并解决了我的问题ModelState.Clear()

于 2015-08-27T04:56:59.270 回答