【发布时间】:2022-01-02 14:20:06
【问题描述】:
我有以下视图模型,它接受密码更改值。因此,它应该接受特殊字符,包括触发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在服务器上设置,在视图中使用。
当我输入诸如“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。 - 我重写了
DefaultModelBinder的BindModel方法只是为了查看它是否抛出异常,但它没有。 - 我将堆栈跟踪中提到的 Application Insights 升级到了最新版本,从 2.16 升级到 2.20。
- 此模型的属性直接在属性上。我尝试使用
[MetadataType]属性将它们移动到元数据类型。它起作用了,只是仍然抛出了异常。
此时,我不知道为什么会抛出异常,以及如何防止或捕获它。任何帮助表示赞赏。
【问题讨论】:
标签: c# asp.net-mvc-5 request-validation