Вы можете получить более тонкий контроль над этим, установив для атрибута requestValidationType
элемента httpRuntime
пользовательский тип, который наследуется от System.Web.Util.RequestValidator
и переопределяет IsValidRequestString
.
К сожалению, это не часть конвейера WebAPI, поэтому нельзя напрямую проверять такие вещи, как фильтры действий (т. е. атрибуты методов контроллера).
Однако, если вы особенно заботитесь о полях проверки формы, валидатор не вызывается для них до тех пор, пока вы не получите к ним доступ, что происходит после запуска фильтров действий, поэтому вы можете отказаться от проверки с использованием атрибута, создав такие классы, как следующее...
public class AllowFormHtmlAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
HttpContext.Current.Items["AllowFormHtml"] = true;
}
}
public class CustomRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
if (context.Items["AllowFormHtml"] as bool? == true && requestValidationSource == RequestValidationSource.Form)
{
validationFailureIndex = 0;
return true;
}
return base.IsValidRequestString(
context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
... Затем просто аннотируйте свой метод контроллера с помощью [AllowFormHtml]
Однако, если вы получаете доступ к полям формы непосредственно из HttpRequest, проще использовать HttpRequest.Unvalidated
, который обходит проверку.
person
hgcummings
schedule
22.07.2015