当我尝试在 .NET Core 中反序列化 FormFile 对象时,为啥会出现奇怪的异常?

Posted

技术标签:

【中文标题】当我尝试在 .NET Core 中反序列化 FormFile 对象时,为啥会出现奇怪的异常?【英文标题】:Why am I getting a strange exception when I try to de-serialize a FormFile object in .NET Core?当我尝试在 .NET Core 中反序列化 FormFile 对象时,为什么会出现奇怪的异常? 【发布时间】:2021-12-04 03:57:03 【问题描述】:

我有一个 MVC .NET Core Web 应用程序,在一个控制器方法中,我正在序列化一个名为“file”的 FormFile 对象,如下所示:

var serializedFile = JsonConvert.SerializeObject(file, new JsonSerializerSettings
                    
                        TypeNameHandling = TypeNameHandling.Auto,
                        NullValueHandling = NullValueHandling.Ignore,
                    );

然后在同一个控制器方法中,我将这个序列化变量存储在 TempData 中,如下所示:

TempData["myFile"] = serializedFile ;

然后在另一个控制器方法中,我试图反序列化这个对象,如下所示:

    var deserializedFile = JsonConvert.DeserializeObject<FormFile>(TempData["myFile"].ToString(),
        new JsonSerializerSettings
        
            TypeNameHandling = TypeNameHandling.Auto,
            NullValueHandling = NullValueHandling.Ignore,
        );

但是当我这样做时,我会抛出这个异常: Newtonsoft.Json.JsonSerializationException:'Microsoft.AspNetCore.Http.FormFile'上的'ContentDisposition'值设置错误。' 内部异常 NullReferenceException:对象引用未设置为对象的实例。

我已经尝试了很长时间且令人沮丧,但我无法弄清楚为什么会发生这种情况。任何帮助,将不胜感激?谢谢!

【问题讨论】:

【参考方案1】:

您必须修复临时数据名称

TempData["myFile"] = serializedFile ;
// and 
TempData["theFile"].ToString(),

您应该只选择一个 - “myFile”或“theFile”

为了防止异常,最好使用这种语法

if (TempData.ContainsKey("myFile"))

.....

默认情况下,TempData 的容量很小,因为它被保存为 cookie。它的大小小于 4kb。您可以获得数据的原因之一可能是这个。您必须配置会话以允许保留更多数据。

要做到这一点,你可以关注这个https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1&WT.mc_id=DT-MVP-5003235#configure-the-tempdata-provider

另一个原因是 TempData 在第一次读取后清除。因此,如果您之前使用它,它也可以为空。要保留数据,您必须使用 Keep 或 Peak 关键字进行阅读。它不会永远保留数据,而只会在 2 个请求之间保留数据。在这些数据也消失之后。

您也可以使用 Session 代替 TempData,但它会降低应用程序的可扩展性,因为它必须为每个连接的用户创建一个 Session 对象,并且每个对象都占用一些服务器资源内存或硬盘驱动器。

【讨论】:

这是我在帖子中的错字。我在代码中将它们都称为“myFile”,但我仍然得到我之前提到的运行时异常。 我在帖子中进行了更正。 "您必须配置会话以允许保留更多数据。"。我对 .NET Core 有点陌生,你能告诉我该怎么做吗?或者,我可以使用比 TempData 更好的选项来在控制器之间持久化数据吗? @Rocker2982 我更新了我的答案,希望对您有所帮助 我使用了 Session 而不是 TempData,它给了我同样的异常:'Microsoft.AspNetCore.Http.FormFile' 上的'ContentDisposition' 值设置错误。'内部异常 NullReferenceException:对象引用未设置为对象的实例。

以上是关于当我尝试在 .NET Core 中反序列化 FormFile 对象时,为啥会出现奇怪的异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Weka-for-Android 中反序列化保存的模型

在 .NET 中反序列化 Pokemon API

如何在 .NET 中反序列化为本地集合?

在 Visual Basic .NET 中反序列化 JSON

是否可以确定在 Json.Net 中反序列化了哪些属性? [复制]

如何在 asp.net 中反序列化 Json-Object