È possibile ottenere un controllo più granulare su questo impostando l'attributo requestValidationType
dell'elemento httpRuntime
ad un tipo personalizzato che eredita da System.Web.Util.RequestValidator
e sostituisce IsValidRequestString
.
Purtroppo questo non fa parte della pipeline WebAPI, quindi non è possibile controllare direttamente elementi come i filtri di azione (ovvero gli attributi sui metodi del controller).
Tuttavia, se si preoccupa specificamente dei campi Convalida dei moduli, il Convalida non viene richiamato fino a quando non li si accede, cosa che accade dopo l'attivazione dei filtri di azione, quindi è possibile annullare la convalida utilizzando un attributo con la creazione di classi come la seguente ...
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);
}
}
... Poi basta annotare il metodo di controller con [AllowFormHtml]
Tuttavia, se si sta accedendo campi del modulo direttamente dal HttpRequest, è più semplice da usare HttpRequest.Unvalidated
, che ignora la convalida.
Questa è l'unica soluzione che ha funzionato per me. Aggiungendo 'requestValidationMode = '2.0'' a web.config e provando l'attributo' [ValidateInput (false)] 'sul metodo di azione NON ha funzionato.Ha iniziato a funzionare dopo aver aggiunto 'requestPathInvalidCharacters =" "'. Penso che questo sia dovuto al fatto che l'errore qui è parte della convalida Request.Path piuttosto che della convalida Request.Form. – quakkels
Non ha bisogno di essere globale, basta usare l'elemento 'location' per limitare il percorso. Quindi se la tua rotta dell'API Web è in 'api/foo' puoi limitare la posizione a' path = "api/foo" 'e aggiungere lì la configurazione' httpRuntime'. Confermato funziona bene in IIS. Inoltre, MSDN dichiara esplicitamente che "" può essere "dichiarato a livello di macchina, sito, applicazione e sottodirectory". Ho aggiornato la risposta. –
kamranicus