C# 什么会在MVC5框架管道中触发验证异常

C# 什么会在MVC5框架管道中触发验证异常,c#,asp.net-mvc-5.2,request-validation,C#,Asp.net Mvc 5.2,Request Validation,不确定这是否是问这个问题的正确地方,但当使用MVC5在字符串中发布HTML时,我遇到了一个问题。问题是:一旦控制器被请求击中并将发送响应,ASP.NET MVC framework中还有什么会触发如下验证错误?: 潜在危险的请求。从中检测到表单值 客户端(messagebody=” 在执行过程中生成了未处理的异常 当前web请求。有关源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常 堆栈跟踪: [HttpRequestValidationException(0x80004005):潜在危险

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

潜在危险的请求。从中检测到表单值 客户端(messagebody=” 在执行过程中生成了未处理的异常 当前web请求。有关源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常

堆栈跟踪:

[HttpRequestValidationException(0x80004005):潜在危险 从客户端messagebody=“此处的html标记”)检测到Request.Form值。 System.Web.HttpRequest.ValidateString(字符串值,字符串 collectionKey,RequestValidationSource requestCollection)+12339710
System.Web.HttpValueCollection.Get(字符串名)+90
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(字符串 路径,HttpVerb动词,HttpContext上下文,CachedVary CachedVary)+956 System.Web.Caching.OutputCacheModule.OnLeave(对象源,EventArgs 事件参数)+1212
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +92 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+165

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

public class MyClassVM 
{
  [AllowHtml]
   public string MessageBody { get; set; }
}
[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);
}
…因此,到达控制器操作并反序列化为对象没有问题。然后在控制器的操作中,我让框架将发布消息的内容反序列化为MyClassVM实例,如下所示:

public class MyClassVM 
{
  [AllowHtml]
   public string MessageBody { get; set; }
}
[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);
}
但是,由于请求中包含html代码,因此到达了
private void Application_Error(object sender,EventArgs e)
方法,并且该阶段的Server.GetLastError()包含验证异常

为什么?<强>一旦控制器几乎完成了它的任务,什么可能触发验证错误?它是否是在响应中间的筛选器中的某个东西?< /强>(有一些过滤器,但它们看起来相当基本的验证过滤器,另一个修改JSON序列化器来替换一些日期,如果有的话)。< / P> 此外,在调试时,我能看到的最后一段代码是一些访问System.Security.Principal.IIdentity的属性,但我不认为这是一个问题

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

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


谢谢

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

查看以下答案:自定义模型绑定器链接看起来很有希望。我正在查看,谢谢。我意识到在请求到达我的控制器之前,我已经执行了一个DateTimeConvertModelBinder:IModelBinder,这可能会影响事情。但是,当控制器被击中时,服务器。GetLastError()为null,这让人困惑,因为它使我认为服务器错误发生在IModelBinder执行之后。不。禁用自定义模型绑定没有任何区别,所以它一定是其他东西。。