można uzyskać kontrolę nad bardziej precyzyjną nad tym przez ustawienie atrybutu elementu httpRuntime
requestValidationType
do rodzaju niestandardowej, która dziedziczy od System.Web.Util.RequestValidator
i zastępuje IsValidRequestString
.
Niestety, nie jest to część potoku WebAPI, więc nie można bezpośrednio sprawdzić takich rzeczy, jak filtry akcji (tj. Atrybuty w metodach kontrolera). Jeśli jednak szczególnie dotyczy to pól Validation of Form, Validator nie zostanie wywołany, dopóki nie uzyskasz do nich dostępu, co ma miejsce po uruchomieniu Filtru akcji, więc możesz zrezygnować z walidacji za pomocą atrybutu poprzez tworzenie klas jak poniżej ...
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);
}
}
... Wtedy właśnie opisywanie metodę kontrolera z [AllowFormHtml]
Jednakże, jeśli masz dostęp pól formularza bezpośrednio z HttpRequest, to prostsze w użyciu HttpRequest.Unvalidated
, która pomija sprawdzanie poprawności.
To jedyne rozwiązanie, które sprawdziło się u mnie. Dodanie 'requestValidationMode = '2.0'' do pliku web.config i wypróbowanie atrybutu" [ValidateInput (false)] "w metodzie akcji NIE działa.Zaczęło działać po dodaniu 'requestPathInvalidCharacters =" "". Myślę, że to dlatego, że błąd tutaj jest częścią sprawdzania poprawności Request.Path, a nie sprawdzania Request.Form. – quakkels
Nie musi być globalna, wystarczy użyć elementu 'location', aby ograniczyć ścieżkę. Jeśli więc twoja trasa Web API jest pod 'api/foo' możesz ograniczyć lokalizację do' path = "api/foo" 'i dodać tam konfigurację' httpRuntime'. Potwierdzone to działa dobrze w IIS. Również MSDN wyraźnie stwierdza, że '' może być "zadeklarowane na poziomie komputera, witryny, aplikacji i podkatalogów". Zaktualizowałem odpowiedź. –
kamranicus