我有以下视图模型,它接受密码更改值。因此,它应该接受特殊字符,包括触发HttpRequestValidationException
- '<' 和 '>' 的字符。所以我[AllowHtml]
在适当的属性上添加了属性:
public class ChangePasswordModel
{
public bool ShowPassword { get; set; }
public string UserMessage { get; set; }
[Required]
[StringLength(int.MaxValue, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
[ValidPassword]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[AllowHtml]
public string Password { get; set; }
[DataType(DataType.Password)]
[Required]
[Display(Name = "Confirm password")]
[Compare(nameof(Password), ErrorMessage = "The {1} and {0} do not match.")]
[AllowHtml]
public string ConfirmPassword { get; set; }
}
这里ShowPassword
和UserMessage
在服务器上设置并在视图中使用。
当我输入诸如“<Script/>1234”之类的密码时,一切正常,模型验证,执行操作,ViewResult
执行,然后,ViewResult
在客户端和客户端之间的某个地方,HttpRequestValidationException
抛出这个堆栈跟踪:
Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep(HttpContextBase context, Action step)
Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule.OnExecuteRequestStep(HttpContextBase context, Action step)
事件中,我在 Global.asax.cs 中发现了Application_Error
它,除了通用消息之外,向用户返回任何有用信息都为时已晚。
我尝试了什么:
- 我有一个全局变量
HandleErrorAttribute
,我在其中检测到一个HttpRequestValidationException
并将其作为视图中的验证消息返回给用户。当用户在不允许的地方输入 HTML 时,这适用于其他模型和视图,但在这种情况下,OnException
不会触发属性的覆盖。 - 我用上面的属性修饰了具体的动作
- 我
IResultFilter
在上面的属性中实现并覆盖了OnResultExecuted
, 来测试视图执行后是否抛出异常。该ResultExecutedContext.Exception
属性为null。 - 我覆盖了just 的
BindModel
方法,DefaultModelBinder
看看它是否抛出异常,但它没有。 - 我将堆栈跟踪中提到的 Application Insights 升级到了最新版本,从 2.16 到 2.20。
- 该模型直接在属性上具有其属性。
[MetadataType]
我尝试使用属性将它们移动到元数据类型。它起作用了,只是仍然抛出了异常。
在这一点上,我不知道为什么抛出异常,以及如何防止或捕获它。任何帮助表示赞赏。