2016-10-18 3 views
0

Я использую следующий метод внутри моего проекта ASP.NET MVC, чтобы получить некоторые XML-данные из другого веб-сервиса:ASP.NET MVC: Вывод проверки

[HttpPost] 
[ValidateInput(false)] 
public ActionResult MyAction() 
{ 
    try 
    { 
     byte[] reqContent = Helper.GetBytes(Request.Unvalidated.Form["xml"]); 

     WebRequest request = WebRequest.Create("url"); 
     request.Method = "POST"; 
     request.ContentType = "text/xml"; 
     request.ContentLength = reqContent.Length; 
     request.GetRequestStream().Write(reqContent, 0, reqContent.Length); 

     string responseXml = null; 

     using (WebResponse response = request.GetResponse()) 
     { 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       responseXml = reader.ReadToEnd(); 
      } 
     } 

     return Content(responseXml, "text/xml"); 
    } 

    catch(Exception) 
    { 
     return Json(new { Error = true }); 
    } 
} 

Запрос в действии работает идеально и I получите правильный ответ, когда я отлаживаю код. Но, к сожалению, когда я смотрю на инструменты Chrome Debug, код ответа из моего действия (а не запрос, отправленный с использованием WebRequest) равен 500 с ошибкой: «Потенциально опасное значение Request.Form было обнаружено у клиента (xml = somexml) . ".

Есть ли какая-то выходная проверка или я пропустил что-то еще здесь? Кроме того, тело POST-запроса на метод контроллера MyAction состоит из данных XML, но с использованием атрибута ValidateInput(false) и объекта Unvalidated объекта Request я не получаю исключения и все работает нормально внутри метода.

EDIT: РЕШЕНИЕ

Благодаря ответ, который я отметил, как принято, я не только изменил проверку входных данных на соответствие со стандартами даты, я копал глубже в возможные причины и понял, что проблема была глобальный OutputCacheAttribute. This post окончательно решил проблему.

ответ

2

MVC все еще проверяет запрос POST, прежде чем вы нажмете на свое действие. Новый способ заключается в атрибуте свойства, которое должно содержать XML с [AllowHtml]. [ValidateInput(false)] устарел. См. Securing Your ASP.NET Applications.

public class PostXmlModel { 
    [AllowHtml] 
    public string Xml {get; set;} 
} 

[HttpPost] 
public ActionResult MyAction(PostXmlModel postData) { 
    string xml = postData.Xml; 
    // ... 
} 

PS: чтобы сделать [ValidateInput(false)] работу, вам также необходимо установить <httpRuntime requestValidationMode="2.0" /> в web.config (не рекомендуется). См. Allow user to input html in asp net mvc validateinput or allowhtml.

Смежные вопросы