ValidateRequest="false" не работает в Asp.Net 4

У меня есть форма, в которой я использую ckeditor. Эта форма отлично работала в Asp.Net 2.0 и 3.5, но теперь она не работает в Asp.Net 4+. У меня есть ValidateRequest="ложная" директива. Какие-либо предложения?

7 ответов

Решение

Нашел решение на странице ошибок. Просто нужно добавить requestValidationMode="2.0"

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

Информация MSDN: свойство HttpRuntimeSection.RequestValidationMode

Есть способ повернуть проверку обратно на 2.0 для одной страницы. Просто добавьте следующий код в ваш web.config:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

Я знаю, что это старый вопрос, но если вы столкнулись с этой проблемой в MVC 3, то вы можете украсить свой ActionMethod с [ValidateInput(false)] и просто отключите проверку запроса для одного ActionMethod, что удобно. И вам не нужно вносить какие-либо изменения в web.config файл, так что вы все еще можете использовать проверку запросов.NET 4 везде.

например

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

Это работает без изменения режима проверки.

Вы должны использовать System.Web.Helpers.Validation.Unvalidated помощник из System.Web.WebPages.dll, Собирается вернуть UnvalidatedRequestValues объект, который позволяет получить доступ к форме и QueryString без проверки.

Например,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

У меня работает для MVC3 и.NET 4.

Обратите внимание, что другой подход заключается в том, чтобы придерживаться поведения проверки 4.0, но определить свой собственный класс, который получается из RequestValidator и установить:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(где YourNamespace.YourValidator это хорошо, вы должны быть в состоянии угадать...)

Таким образом вы сохраняете преимущества поведения 4.0s (в частности, то, что проверка происходит раньше при обработке), и в то же время пропускаете запросы, которые необходимо пропустить.

Я нашел решение здесь: https://www.aspsnippets.com/Articles/Solved-ValidateRequest-false-not-working-in-Net-40-and-45-in-ASPNet.aspx

Краткое содержание:

  1. Если вы хотите установить это на уровне страницы, установите ValidateRequest="false" следующим образом.<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="false" %>
  2. Вам также необходимо изменить httpRuntime, чтобы он имел requestValidationMode="2.0" или добавить его в<system.web>так
       <system.web>
    <httpRuntime maxRequestLength="91200" executionTimeout="9000" requestValidationMode="2.0" />
</system.web>

У меня это работает в .NET 4.8.

После миграции моего приложения с dotnet framework 3.5 на 4.7 я получаю ту же ошибку.

Решение этой проблемы путем добавления requestValidationMode="2.0" в httpRuntime в system.web:

      <httpRuntime maxRequestLength="2097151" requestValidationMode="2.0"/>
Другие вопросы по тегам