当我尝试在 .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 中反序列化保存的模型
在 Visual Basic .NET 中反序列化 JSON