5

Questo è collegato a questo question, ma in questo caso non è qualcosa che sto tornando, ma piuttosto il legame del modello. Sto usando Postmark per gestire le e-mail in arrivo, che pubblica una pagina con un JSON payload.Come posso gestire input JSON di grandi dimensioni da Postmark nella mia applicazione MVC?

Ho un modello come di seguito e un'azione che accetta questo payload JSON (pubblicato con application/json) e lo elabora.

public class EmailModel 
{ 
    public IDictionary<string, string> Headers { get; set; } 
    public string From { get; set; } 
    public string Cc { get; set; } 
    public string HtmlBody { get; set; } 
    public string TextBody { get; set; } 
    public string ReplyTo { get; set; } 
    public string Tag { get; set; } 
    public string To { get; set; } 
    public string MessageID { get; set; } 
    public string MailboxHash { get; set; } 
    public string Subject { get; set; } 
    public List<Attachment> Attachments { get; set; } 
} 

public class Attachment 
{ 
    public string Content { get; set; } 
    public int ContentLength { get; set; } 
    public string ContentType { get; set; } 
    public string Name { get; set; } 

} 

Questo funziona bene per i piccoli accessori, ma per tutto ciò che supera la proprietà maxJsonLength predefinita provoca un errore nel deserializzazione. ("Errore durante la serializzazione o deserializzazione con JavaScript JSerializer JSON.La lunghezza della stringa supera il valore impostato sulla proprietà maxJsonLength.") Perché voglio accettare gli allegati delle immagini, questo significa che molte immagini falliscono.

Ho provato ad aggiornare il web.config, ma come per questi altri thread, questo non è d'aiuto per i controller MVC. Immagino di poter fare probabilmente ciò che è stato menzionato in un IModelBinder personalizzato, ma sono alle prese con il modo di intercettare la deserializzazione. (In altre parole, fallisce ancora perché la deserializzazione è già avvenuta).

Qualche suggerimento? Sono sicuro che è solo qualcosa di stupido che mi manca ....

risposta

3

Si potrebbe scrivere un custom JsonValueProviderFactory che utilizza Json.NET:

public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     if (controllerContext == null) 
      throw new ArgumentNullException("controllerContext"); 

     if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
      return null; 

     var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream); 
     var bodyText = reader.ReadToEnd(); 

     return String.IsNullOrEmpty(bodyText) ? null : new DictionaryValueProvider<object>(JsonConvert.DeserializeObject<ExpandoObject>(bodyText, new ExpandoObjectConverter()) , CultureInfo.CurrentCulture); 
    } 
} 

e nel tuo Application_Start:

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); 
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); 
+0

Grazie Darin - sembra un buon approccio. Domani darò uno scatto. –

+0

@Darin C'è un modo per aggiungere questo solo a un controller specifico anziché all'intera applicazione? –

+0

Ciao Darin, ti dispiacerebbe guardare [la mia domanda] (http://stackoverflow.com/q/32970848/7850) per capire perché questo non funziona per me? Grazie! –

Problemi correlati