#c# #asp.net-core-mvc #deserialization #jsonserializer #iformfile
Вопрос:
У меня есть веб-приложение MVC .NET Core, и в одном методе контроллера я сериализую объект 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,
});
Но когда я это делаю, я получаю это исключение:
Ньютонсофт.Json.Исключение JsonSerializationException: «Ошибка при установке значения «ContentDisposition» в » Microsoft.AspNetCore.Http.Файл формы’.’ Внутреннее исключение NullReferenceException: Ссылка на объект не установлена на экземпляр объекта.
Я пытался в течение долгого и неприятного времени, но я так и не смог понять, почему это происходит. Была бы признательна любая помощь? Спасибо!
Ответ №1:
Вам нужно исправить временные имена данных
TempData["myFile"] = serializedFile ;
// and
TempData["theFile"].ToString(),
вы должны выбрать только один — «Мой файл» или «Файл».
и для предотвращения исключений лучше использовать этот синтаксис
if (TempData.ContainsKey("myFile"))
{
.....
}
Данные TempData по умолчанию имеют очень небольшую емкость, так как они хранятся в виде файлов cookie.Его размер составляет менее 4 кб. Одна из причин, по которой вы можете получить данные, может заключаться в следующем. Вы должны настроить сеанс, чтобы сохранить больше данных.
Для этого вы можете следовать этому https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1amp;WT.mc_id=DT-MVP-5003235#configure-the-tempdata-provider
Другая причина заключается в том, что TempData очищается после первого чтения. Так что, если вы используете его раньше, он тоже может быть нулевым. Чтобы сохранить данные, вы должны прочитать их с помощью ключевых слов Keep или Peak. И он хранит данные не вечно, а только между 2 запросами. После этого данные тоже исчезают.
В качестве альтернативы вы можете использовать Session вместо TempData, но это снизит масштабируемость ваших приложений, потому что для каждого подключенного пользователя придется создавать объект сеанса, а каждый объект требует некоторой памяти ресурсов сервера или жесткого диска.
Комментарии:
1. это была опечатка, которую я сделал в посте. Я ссылаюсь на них обоих как на «Мой файл» в коде, но я все еще получаю исключение во время выполнения, о котором я упоминал ранее.
2. Я внес поправку в сообщение.
3. «Вы должны настроить сеанс, чтобы сохранить больше данных».. Я немного новичок в .NET Core, можете ли вы сказать мне, как я могу это сделать? В качестве альтернативы, есть ли лучшие варианты, которые я могу использовать для сохранения данных между контроллерами, чем TempData?
4. @Rocker2982 Я обновляю свой ответ, надеюсь, это поможет
5. Я использовал сеанс вместо TempData, это дает мне то же исключение: значение параметра «Ошибка» в «Расположение содержимого» в » Microsoft. AspNetCore.Http.FormFile». » Внутреннее исключение NullReferenceException: Ссылка на объект не установлена на экземпляр объекта.