У меня есть веб-приложение на основе MVC3 (без бета-версии или кандидата на выпуск, версия RTM/RTW), в котором есть действие, которое принимает XML-файлы для обработки.
Конечно, для MVC это кажется злом из-за возможных атак, поэтому он этого не допускает. Ну, я пытаюсь поставить либо AllowHtml на объект модели как таковой:
public class XMLModel
{
[AllowHtml]
public string msg { get; set; }
}
Или я устанавливаю для ValidateInput значение false в моем методе действия, например:
[ValidateInput(false)]
public ActionResult AddCDR(XMLModel model)
{
}
Причина наличия «строгой» типизированной модели в первую очередь заключалась в том, что я изначально пытался использовать строковое значение с именем «msg» в качестве параметра метода действия, но это всегда возвращалось пустым.
Теперь, когда кто-то отправляет сообщение в эту форму на том же компьютере или с компьютера в сети, поле сообщения всегда остается пустым.
Я проверил с помощью WireShark, что данные действительно находятся в запросе.
Теперь одна интересная вещь. В MVC 3 в этом нет необходимости. Тем не менее, это имеет небольшое значение.
Если я добавлю это в свою веб-конфигурацию:
<httpRuntime requestValidationMode="2.0" />
Он работает для запросов, исходящих с локального компьютера, но НЕ работает из другой системы.
Я думаю, что версия AllowHtml кажется элегантной — если бы она работала.
Я также узнал об ошибке в RC2 - опять же, это не должно касаться меня, но я все равно попытался добавить следующее в Application_Start():
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();
Как и ожидалось, особой разницы нет.
На моем компьютере для разработки (Win7x64, VS2010) все работает, как и ожидалось, но в целевой системе (Win2008R2x64, IIS7.5) вышеуказанные проблемы доставляют мне неприятности.
Очень важное замечание: если я публикую действие без угловых скобок, я получаю данные формы, как и ожидалось. Однако, как только появляются угловые скобки, либо мое действие вообще не вызывается, либо оно не находит данные формы ни в параметрах метода действия, ни, например, в Request.Params["msg"], где оно должно быть.
Любые идеи, чтобы разрешить XML через?
ОБНОВЛЕНИЕ
Я пытался обойти это, ожидая, пока кто-нибудь ответит здесь. Я еще не смог ее решить, но проверил несколько дополнительных деталей;
- Во-первых, я убедился, что версия ASP.NET MVC 3, установленная как на моем компьютере для разработки, так и на веб-сервере, одинакова; v3.0.20105.0 (согласно установке и удалению программ).
- The web application was actually created with the MVC3 beta, then converted to RC1 and RC2 as they came out, and finally to the RTM version. This meant I had to modify some code because of the ViewBag change. However, since I didn't know exactly what else had changed, I created a brand new MVC3 application with the RTM version, created a controller by the same name, with the same action method, taking a model object similar to the currently used one, renamed the old web app directory and put this new one in place. Exactly the same thing happens - i.e. the parameter with the AllowHtml attribute comes through with all content when the request is made from the local machine, but if it comes from a remote machine, then the HTML (XML actually) is stripped out.
- There is no exception. I've installed Elmah and verified this - no exception occurs, my action method is apparently just called with anything looking like XML stripped out from the parameters to the method.
Излишне говорить, что это сводит меня с ума. Вчера мне посоветовали посмотреть исходный код MVC3, но, к сожалению, это мне не очень помогает, так как я не вижу там ничего явно неправильного и не могу отлаживать код на рассматриваемом сервере.
Любые идеи все еще очень желательны, спасибо! :)