2011-01-27 14 views
11

Tengo una aplicación web basada en MVC3 (sin beta o versión candidata, versión RTM/RTW) que tiene una acción que acepta archivos XML para su procesamiento.Problema con el atributo AllowHtml de MVC3

Por supuesto, esto parece malo para MVC debido a posibles ataques, por lo que no lo permite. Bueno, trato de poner ya sea AllowHtml en el objeto de modelo como tal:

public class XMLModel 
    { 
     [AllowHtml] 
     public string msg { get; set; } 
    } 

O me puse ValidateInput en false en mi método de acción como esta:

[ValidateInput(false)] 
    public ActionResult AddCDR(XMLModel model) 
    { 
    } 

La razón de tener un "fuerte "El modelo mecanografiado en primer lugar fue que originalmente intenté tener un valor de cadena llamado" msg "como parámetro de método de acción, pero que siempre regresaba vacío.

Ahora, cuando alguien publica en este formulario, ya sea en la misma máquina o desde una computadora en red, el campo msg siempre está en blanco.

He verificado con WireShark que los datos están realmente en la solicitud.

Ahora, una cosa interesante. Esto no debería ser necesario con MVC 3. Sin embargo, hace una pequeña diferencia.

Si agrego esto a mi web.config:

<httpRuntime requestValidationMode="2.0" /> 

Funciona para las solicitudes procedentes del equipo local, pero que no funciona desde otro sistema.

Creo que la versión de AllowHtml parece elegante, si solo funcionó.

También he descubierto acerca de un error en RC2 - de nuevo, esto no debería afectarme, pero intentó añadir lo siguiente en Application_Start() de todos modos:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

Como era de esperar, no tiene verdadera diferencia.

Todo funciona como se esperaba en mi computadora de desarrollo (Win7x64, VS2010), pero en el sistema de destino (Win2008R2x64, IIS7.5) los problemas anteriores me están causando problemas.

Punto muy importante a tener en cuenta: Si publico en la acción sin corchetes angulares, obtengo los datos del formulario como se esperaba. Sin embargo, tan pronto como aparecen los corchetes angulares, mi acción no se llama en absoluto, o no encuentra los datos del formulario, ni en los parámetros del método de acción ni en, por ejemplo, Request.Params ["msg"] donde debiera ser.

¿Alguna idea para permitir el XML?

ACTUALIZACIÓN

He intentado trabajar mi forma de evitar esto a la espera de que cualquiera pueda llegar a una respuesta aquí. No he podido resolverlo todavía, pero he comprobado algunos detalles adicionales;

  • Primero, verifiqué que la versión de ASP.NET MVC 3 instalada en mi computadora de desarrollo y en el servidor web es la misma; v3.0.20105.0 (según Agregar/Quitar programas).
  • La aplicación web se creó con la versión beta de MVC3, luego se convirtió a RC1 y RC2 a medida que salían, y finalmente a la versión RTM. Esto significaba que tenía que modificar algunos códigos debido al cambio ViewBag. Sin embargo, como no sabía exactamente qué más había cambiado, creé una nueva aplicación MVC3 con la versión RTM, creé un controlador con el mismo nombre, con el mismo método de acción, tomando un objeto modelo similar al usado actualmente. , renombró el directorio de la vieja aplicación web y puso este nuevo en su lugar. Pasa exactamente lo mismo, es decir, el parámetro con el atributo AllowHtml entra con todo el contenido cuando la solicitud se realiza desde la máquina local, pero si proviene de una máquina remota, entonces se elimina el HTML (XML en realidad).
    • No hay excepción. Instalé Elmah y verifiqué esto: no se produce ninguna excepción; al parecer, mi método de acción simplemente se llama con algo que parece XML eliminado de los parámetros del método.

hace falta decir que esto me está volviendo loco. Ayer tuve algunos consejos para ver el código fuente de MVC3, pero desafortunadamente eso no me ayuda realmente, ya que no veo nada obviamente mal allí, y no puedo depurar código en el servidor en cuestión.

¡Cualquier idea aún muy deseada, gracias! :)

Respuesta

3

Estoy respondiendo esto yo mismo porque esta era una situación oscura, y MVC3 no era el problema.

El sistema que PUBLICÓ datos a mi aplicación lo estaba haciendo con datos mal formados. Además de eso, me dijeron que también se estaban transfiriendo a una aplicación MVC2 anterior que funcionaba bien: esto estaba mal, resultó que se estaban GET en ese caso, y GET lo hicieron correctamente.

En todo caso, las pruebas exhaustivas han confirmado que el atributo AllowHtml realmente funciona muy bien. Nunca confíes en tu opinión, aunque. :)

7

No puedo reproducir esto.

Modelo:

using System.Web.Mvc; 

namespace MvcApplication3.Models { 
    public class XmlModel { 
     [AllowHtml] 
     public string msg { get; set; } 
    } 
} 

controlador:

using System.Web.Mvc; 
using MvcApplication3.Models; 

namespace MvcApplication3.Controllers { 
    public class HomeController : Controller { 
     public ActionResult Index() { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Index(XmlModel model) { 
      return View(); 
     } 
    } 
} 

Vista:

@model MvcApplication3.Models.XmlModel 

@using (Html.BeginForm()) { 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.msg) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.msg) 
     @Html.ValidationMessageFor(model => model.msg) 
    </div> 
} 

Estos se añadieron a un proyecto vacío MVC 3 por defecto. Todo se publica bien Cuando elimino [AllowHtml], genera el mensaje de error apropiado.

+0

Gracias, Brad, muy apreciado! He progresado un poco en esto yo mismo, y con suerte confirmaré una solución en algún momento de hoy. –

Cuestiones relacionadas