HttpPostedFileBase ContentLength = 0 после чтения - PullRequest
0 голосов
/ 29 января 2020

Я отправляю json файл на сервер и хочу прочитать это дважды.

[HttpPost]
public ActionResult CreateCases(string fileFormat, Guid key)
{
    var file = Request.Files[0];
    CheckFile(file);
    Create(file);

    return Json();
}

public object Check(HttpPostedFileBase file)
{
    var stream = file.InputStream;
    var serializer = new JsonSerializer();
    using (var sr = new StreamReader(stream))
    using (var jsonTextReader = new JsonTextReader(sr))
    {
        dynamic json = serializer.Deserialize(jsonTextReader);
        ...
    }
}

public object Create(HttpPostedFileBase file)
{
    var stream = file.InputStream;
    var serializer = new JsonSerializer();
    using (var sr = new StreamReader(stream))
    using (var jsonTextReader = new JsonTextReader(sr))
    {
        dynamic json = serializer.Deserialize(jsonTextReader);
        ...
    }
}

В Check метод file.ContentLength = правильное значение

В Create метод file.ContentLength = 0 и json переменная уже = null

Что я делаю не так? Заранее спасибо.

1 Ответ

1 голос
/ 29 января 2020

Что я делаю не так?

Это:

Я [...] хочу прочитать этот [файл] дважды

Ваш клиент отправляет файл в ваше веб-приложение только один раз, поэтому вы должны прочитать его только один раз.

Конечно, вы можете перематывать поток ввода и, по-видимому, решить непосредственную проблему, но это только создает новые проблемы, потому что теперь у вас есть весь файл в памяти одновременно - и ваш код может продолжаться только один раз Запрос прочитан.

Вы не хотите прочитать файл дважды.

Если вы хотите проверить, затем обработать JSON, затем получить JSON, сохранить его в переменной, а затем проверить и обработать эту переменную. Да, это все еще требует от вас прочтения всего тела запроса, но тогда это ваше требование.

...