Отправка данных XML через HTTP POST в IHttpHandler вызывает исключение HttpRequestValidationException

Я пишу реализацию IHttpHandler, которая будет получать данные XML, отправленные через обычный HTTP POST с другого веб-сайта. Вот прототип реализации:

public class MyHandler : IHttpHandler
{
   public void ProcessRequest(HttpContext context)
   {
      string s = context.Request.Form["input"]; // <== this throws HttpRequestValidationException
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(s);
      // ...
   }

   public bool IsReusable
   {
      get { return false; }
   }
}

Я тестирую реализацию на этой простой странице:

<body>
   <form method="post" action="MPSConnector.Results.dsvc">
      <textarea name="input"></textarea>
      <input type="submit" value="Go!" />
   </form>
</body>

Проблема в том, что когда я пытаюсь прочитать «входное» значение из опубликованных данных, если оно содержит строку xml, все, что я получаю, - это HttpRequestValidationException. Я пробовал использовать

<pages validateRequest="false">

в web.config, и добавление атрибута validate = "false" в объявление обработчика в разделе httpHandles безрезультатно.

Как я могу прочитать опубликованный xml в моем обработчике? (обратите внимание, что я ДОЛЖЕН использовать IHttpHandler для этой задачи).

РЕДАКТИРОВАТЬ: версия Framework: 4.0, IIS 7.x

Спасибо вам всем! :)


person Claudio Valerio    schedule 20.01.2011    source источник


Ответы (2)


Насколько я знаю, вам просто нужно закодировать этот XML с помощью сущностей.

Я имею в виду, что ‹должно быть & lt; или> & gt; и т. д.

РЕДАКТИРОВАТЬ: Я обнаружил, что это дубликат: Как можно запросить проверку отключен для HttpHandlers?

Попробуй это!! :)

person Matías Fidemraizer    schedule 20.01.2011
comment
Привет, Матиас, и спасибо за твой ответ. Обратите внимание, что я не могу контролировать данные, которые получит обработчик, страница, которую я опубликовал, является всего лишь примером для тестирования. Я должен предположить, что данные xml не будут кодироваться, основываясь на документации системы, которая будет отправлять данные в производственную среду. - person Claudio Valerio; 20.01.2011
comment
Вы пробовали использовать HTTP-модуль? Попробуйте, если вы получаете данные и можете их закодировать, если это необработанный XML, и тогда ваш обработчик получит закодированные данные. - person Matías Fidemraizer; 20.01.2011
comment
Проблема в том, что запрос содержит не только необработанный XML (в этом случае все, что мне нужно сделать, это прочитать xml из объекта InputStream of Request), но и всю форму, отправленную с одним из ее значений, содержащим строку XML. Когда я пытаюсь прочитать это значение (ввод в моем упрощенном тесте, но запрос будет содержать другие значения, отличные от XML), я получаю исключение. Я пробовал использовать IHttpModule вместо IHttpHandler, но когда я пытаюсь получить доступ к Request.Form NameValueCollection, возникает исключение. Кстати, я бы предпочел не использовать слишком много слоев над управлением запросами, потому что приложение ... - person Claudio Valerio; 20.01.2011
comment
... накладывает на это свою собственную логику (с уровнем абстракции, который динамически создает правый обработчик при запросе к определенной точке входа). - person Claudio Valerio; 20.01.2011

Просто измените web.config следующим образом:

   <location path="Handlers/MyHandler.ashx">
      <system.web>
         <httpRuntime requestValidationMode="2.0" />
      </system.web>
   </location>
person Edgar    schedule 29.04.2015