2011-01-27 10 views
11

Ho un'app Web basata su MVC3 (nessuna versione beta o release candidate, versione RTM/RTW) con un'azione che accetta file XML per l'elaborazione.Problema con attributo MVC3 AllowHtml

Naturalmente, questo sembra male a MVC a causa di possibili attacchi, quindi non lo consente. Beh, cerco di mettere sia AllowHtml sull'oggetto modello come ad esempio:

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

o ho impostato ValidateInput false sul mio metodo di azione di questo tipo:

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

La ragione per avere un "forte "Il modello tipizzato in primo luogo era che inizialmente avevo provato ad avere un valore di stringa chiamato" msg "come parametro del metodo di azione, ma che veniva sempre restituito vuoto.

Ora, quando qualcuno invia questo modulo, sulla stessa macchina o da un computer in rete, il campo msg è sempre vuoto.

Ho verificato con WireShark che i dati sono effettivamente nella richiesta.

Ora, una cosa interessante. Questo non dovrebbe essere necessario con MVC 3. Eppure fa una leggera differenza.

Se posso aggiungere questo nel mio spazio web di configurazione:

<httpRuntime requestValidationMode="2.0" /> 

Si lavora per le richieste provenienti dal computer locale, ma non funziona da un altro sistema.

Penso che la versione di AllowHtml sia elegante, se solo funzionasse.

Ho anche scoperto circa un bug in RC2 - ancora una volta, questo non dovrebbe mi riguarda, ma ho cercato di aggiungere quanto segue in Application_Start() in ogni caso:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

Come previsto, non fa alcuna reale differenza.

Tutto funziona come previsto sul mio computer di sviluppo (Win7x64, VS2010), ma sul sistema di destinazione (Win2008R2x64, IIS7.5) i problemi di cui sopra mi stanno dando problemi.

Punto molto importante da notare: Se si registra un'azione senza parentesi angolari, ottengo i dati del modulo come previsto. Non appena vengono mostrate le parentesi angolari, la mia azione non viene chiamata affatto, oppure non trova i dati del modulo, né nei parametri del metodo di azione né in Ad esempio Request.Params ["msg"] dove dovrebbe essere.

Qualche idea per consentire l'XML?

UPDATE

Ho cercato di lavorare il mio modo per aggirare questo in attesa di qualcuno a venire con una risposta qui. Non sono ancora riuscito a risolverlo, ma ho controllato alcuni dettagli aggiuntivi;

  • Innanzitutto, ho verificato che la versione di ASP.NET MVC 3 installata sul mio computer di sviluppo e sul server Web è la stessa; v3.0.20105.0 (in base a Aggiungi/Rimuovi programmi).
  • L'applicazione Web è stata effettivamente creata con MVC3 beta, quindi convertita in RC1 e RC2 non appena sono usciti e infine nella versione RTM. Ciò significava che dovevo modificare del codice a causa della modifica di ViewBag. Tuttavia, poiché non sapevo esattamente cos'altro fosse cambiato, ho creato una nuovissima applicazione MVC3 con la versione RTM, creato un controller con lo stesso nome, con lo stesso metodo di azione, prendendo un oggetto modello simile a quello attualmente utilizzato , ribattezzata la vecchia directory dell'app Web e mettila in posizione. Esattamente la stessa cosa accade - cioè il parametro con l'attributo AllowHtml arriva con tutto il contenuto quando la richiesta è fatta dal computer locale, ma se proviene da una macchina remota, allora l'HTML (XML in realtà) viene rimosso.
    • Non ci sono eccezioni. Ho installato Elmah e verificato ciò - non si verifica alcuna eccezione, il mio metodo di azione è apparentemente chiamato solo con qualcosa che assomiglia all'XML spogliato dai parametri al metodo.

Inutile dire che questo mi sta facendo impazzire. Ho avuto qualche consiglio ieri di guardare il codice sorgente di MVC3, ma sfortunatamente questo non mi aiuta, visto che non riesco a vedere nulla di evidentemente sbagliato, e non riesco a eseguire il debug del codice sul server in questione.

Qualsiasi approfondimento ancora fortemente desiderato, grazie! :)

risposta

3

Sto rispondendo a me stesso perché questa era una situazione oscura e MVC3 non era il problema.

Il sistema che i dati POSTed alla mia applicazione lo facevano con dati non validi. In aggiunta a ciò, mi è stato detto che stavano anche postando su una vecchia applicazione MVC2 che funzionava bene - questo era sbagliato, si è scoperto che stavano facendo GETting in quel caso, e OTTENGONO che capita di fare correttamente.

In caso contrario, test abbastanza approfonditi hanno confermato che l'attributo AllowHtml funziona davvero molto bene. Non fidarti mai del tuo contributo, comunque. :)

7

Non riesco a riprodurre questo.

Modello:

using System.Web.Mvc; 

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

Controller:

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> 
} 

Questi sono stati aggiunti ad un vuoto di progetto MVC 3 di default. Tutto funziona bene. Quando rimuovo [AllowHtml], genera il messaggio di errore appropriato.

+0

Grazie, Brad, molto apprezzato! Ho fatto alcuni progressi su questo me stesso, e speriamo di confermare una soluzione oggi. –

Problemi correlati