Почему я получаю странное исключение, когда пытаюсь удалить сериализацию объекта FormFile в .NET Core?

#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: Ссылка на объект не установлена на экземпляр объекта.