Подтвердить что ты не робот

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

История вопроса.

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

Обновление TL;DR

РЕДАКТИРОВАТЬ 2 После того, как еще одна ошибка в этом случае окажется ошибкой в ​​Chrome 19. См. Здесь:

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

Ничего похожего на минуту!: -)

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

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

END TL;DR

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

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

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

<form action="/Events/ImportLocal" enctype="multipart/form-data" method="post">

<input id="uploadFile" name="uploadFile" type="file" />
<input type="submit" value="Upload Events" />    

</form>

Довольно прямо:

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

[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<Event> importActionResults = _eventImportServices.Import(stringOut);

Цель состоит в том, чтобы передать текстовый редактор или средство чтения строк в метод службы, поскольку за кулисами используется реализация обработки 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-latest и IE8/9 работают должным образом. Журналы Fiddler показывают одно и то же поведение с большой разницей в том, что вторая авторизация авторизации 401 не отправляет искажение формы и искажается.

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

Спасибо

4b9b3361

Ответ 1

Это просто идея попробовать. Обратите внимание, что StreamReader имеет много конструкторов:

http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

В некоторых конструкторах он пытается автоопределить кодировку (если задано), и если она не может ее обнаружить, она возвращается к указанному. Используемый конструктор использует кодировку UTF-8. Вы можете изменить конструктор для автоматического определения кодировки, а если нет, то используйте UTF-8.

Ответ 2

Я думаю, вам нужно проверить разрешения на папку IIS/виртуальный веб-сайт, в который загружаются файлы и сам dir, если они находятся в разных местах.

Ответ 3

Хороший вопрос. Аутентификация была первым, что мне пришло в голову. Это нормально, чтобы получить два несанкционированных и 3-й авторизованный. Это как раз то, как работает NTLM.

Если нужно также заставить его работать и с Chrome, и не может дождаться исправления, я бы предложил включить проверку подлинности в формах, которая перенаправляется на тот же домен, но на другой порт, где находится приложение LOGIN с проверкой подлинности Windows. Это приложение устанавливает cookie формы или нет и отправляет вам основное приложение. Процесс хорошо описан здесь: http://msdn.microsoft.com/en-us/library/ms972958.aspx

Таким образом, ваш NTLM выполняется один раз, а затем у вас есть файл cookie, поэтому NTLM не используется с вашим запросом POST, и все должно работать должным образом.

Просто подумал, что я поделюсь этим:)