如何在MVC应用程序中处理来自Postmark的大型JSON输入



这与这个问题有关,但在这种情况下,我返回的不是它,而是模型绑定。我使用Postmark来处理传入的电子邮件,这些电子邮件会发布到带有JSON负载的页面上。

我有一个如下所示的模型和一个在这个JSON负载中采取并处理它的操作(用application/JSON发布)

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

这对于小型附件很好,但对于任何超过默认maxJsonLength属性的附件,都会导致反序列化错误。("使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过了在maxJsonLength属性上设置的值。")因为我想接受图像附件,这意味着大多数图像都会失败。

我尝试过更新web.config,但与其他线程一样,这对MVC控制器没有帮助。我想我可能可以做自定义IModelBinder中提到的事情,但我很难拦截反序列化。(换句话说,它仍然失败,因为反序列化已经发生)。

有什么建议吗?我确信我错过的只是一些愚蠢的东西。。。。

您可以编写一个使用Json.NET:的自定义JsonValueProviderFactory

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

并且在您的Application_Start:中

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

相关内容

  • 没有找到相关文章

最新更新