Первая загрузка MVC3 HttpPostedFileBase не дает данных, но последующая выполняет

Предыстория проблемы.

РЕДАКТИРОВАТЬ 3 Я могу убедиться, что это снова работает в Chrome 20. Спасибо!

Обновление TLDR

РЕДАКТИРОВАТЬ 2 После еще большего размышления об этом, похоже, это ошибка в Chrome 19. См. здесь:

http://groups.google.com/a/chromium.org/group/chromium-bugs/browse_thread/thread/15bc4992bcd4be1d/ b905e8de20ee58fa?lnk=raot

Нет ничего лучше последней ошибки! :-)

Последние версии Firefox и IE8/9 работают как положено. Журналы Fiddler показывают такое же поведение, с той существенной разницей, что 2-я проверка авторизации 401 не отправляет искаженную полезную нагрузку формы и работает так, как ожидалось.

Это похоже на тестовый пример, и мы работаем над исправлением! Так что, надеюсь, для любого из вас, кто мог столкнуться с этим, это поможет!

END TLDR

У меня есть действие контроллера, которое принимает только загруженный файл, который представляет собой CSV-файл «событий». За кулисами этот CSV анализируется, превращается в объекты Event, а данные синхронизируются в базе данных. В результате пользователю предлагается загрузить электронную таблицу Excel, содержащую все ошибки в каждой возникшей строке.

Все это отлично работает локально на моем компьютере для разработки. Однако после развертывания в среде DEV я получаю другие результаты.Первая попытка загрузить файл приводит к тому, что поток, какое слово я здесь ищу, не читается? Он правильно сообщает свою длину, но попытки извлечь информацию ничего не дают. Последующие чтения имеют данные, и все работает так, как ожидалось.

Я дам вам соответствующий код. Во-первых, сгенерированная HTML-форма упростилась:

Довольно прямолинейно:

Действие контроллера (простите за беспорядок, я возился с этим уже пару часов):

[HttpPost]
public ActionResult ImportLocal(HttpPostedFileBase uploadFile)
{
    if (uploadFile == null || uploadFile.ContentLength <= 0)
    {
        BaseLogger.Info("uploadFile is null or content length is zero...");
        //Error content returned to user
    }

    BaseLogger.InfoFormat("Community Import File Information: Content Length: {0}, Content Type: {1}, File Name: {2}",
    uploadFile.ContentLength, uploadFile.ContentType, uploadFile.FileName);

//This logger line is always reporting as correct. Even on the attempts where I can't pull out the stream data, I'm seeing valid values here.
//EXAMPLE output on failed attempts:
//Import File Information: Content Length: 315293, Content Type: application/vnd.ms-excel, File Name: Export_4-30-2012.csv

    BaseLogger.InfoFormat("Upload File Input Stream Length: {0}", uploadFile.InputStream.Length);           
//This is reporting the correct length on failed attempts as well


//I know the below is overly complicated and convoluted but I'm at a loss for why the inputstream in HttpPostedFileBase is not pulling out as expected
//so I've been testing
        var target = new MemoryStream();
        uploadFile.InputStream.CopyTo(target);
        byte[] data = target.ToArray();
        BaseLogger.InfoFormat("File stream resulting length = {0}", data.Length);
//This reports correctly. So far so good.

        StringReader stringOut;
        var stream = new MemoryStream(data) {Position = 0};

        using (var reader = new StreamReader(stream))
        {
            string output = reader.ReadToEnd();
            BaseLogger.InfoFormat("Byte[] converted to string = {0}", output);
//No go...output is reported to be empty at this point so no data ever gets sent on to the service call below
            stringOut = new StringReader(output);
        }


        //Build up a collection of CommunityEvent objects from the CSV file
        ImportActionResult importActionResults = _eventImportServices.Import(stringOut);

Цель состоит в том, чтобы передать textreader или stringreader для метода службы, так как за кулисами используется реализация обработки CSV, которой нужны эти типы.

Есть идеи, почему первый запрос не работает, а последующие работают? Я чувствую, что мне нужен свежий взгляд, поскольку у меня заканчиваются идеи.

Наконец, IIS 7.5 является целью как локально через IIS Express, так и на целевом сервере.

Спасибо

EDITза награду:

Я копирую сюда свое сообщение о награде и вывод Fiddler для каждого запроса

Я добавил несколько комментариев к этому вопросу. Проблема связана с NTLM. То, что я вижу в Fiddler, — это 401 Несанкционированный запрос 1 с действительными данными формы (точка, насколько я понимаю, эти первые два 401 Несанкционированных запроса являются «нормальными» в сценариях, где включена только проверка подлинности Windows; проверьте, пожалуйста?). Перечисленный запрос 2 снова представляет собой 401 с теми же данными формы, за исключением того, что данные загруженного файла теперь представляют собой просто набор полей, данные точно такого же размера, но не точные загруженные данные.Запрос 3 — это 200 OK, который содержит искаженные данные, и это то, что получает действие моего контроллера. Как заставить NTLM хорошо работать с загрузкой файлов?

Вот вывод Fiddler для каждого запроса:

Запрос 1) enter image description here

Запрос 2) enter image description here

И, наконец, запрос 3, который является обработанным HTTP 200 OK enter image description here

РЕДАКТИРОВАТЬ 2 После еще большего размышления об этом, похоже, это ошибка в Chrome 19. См. здесь:

http://groups.google.com/a/chromium.org/group/chromium-bugs/browse_thread/thread/15bc4992bcd4be1d/ b905e8de20ee58fa?lnk=raot

Нет ничего лучше последней ошибки! :-)

Последние версии Firefox и IE8/9 работают должным образом. Журналы Fiddler показывают такое же поведение, с той существенной разницей, что 2-я проверка авторизации 401 не отправляет искаженную полезную нагрузку формы и работает так, как ожидалось.

Это похоже на тестовый пример, и мы работаем над исправлением! Так что, надеюсь, для любого из вас, кто мог столкнуться с этим, это поможет!

Спасибо

28
задан Khepri 5 June 2012 в 20:26
поделиться