История вопроса.
РЕДАКТИРОВАТЬ 3 Я могу проверить, что это снова работает в Chrome 20. Спасибо!
Обновление TL;DR
РЕДАКТИРОВАТЬ 2 После того, как еще одна ошибка в этом случае окажется ошибкой в Chrome 19. См. Здесь:
Ничего похожего на минуту!: -)
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)
Запрос 2)
И, наконец, запрос 3, который обрабатывается HTTP 200 OK
РЕДАКТИРОВАТЬ 2 После того, как еще одна ошибка в этом случае окажется ошибкой в Chrome 19. См. Здесь:
Ничего похожего на минуту!: -)
Firefox-latest и IE8/9 работают должным образом. Журналы Fiddler показывают одно и то же поведение с большой разницей в том, что вторая авторизация авторизации 401 не отправляет искажение формы и искажается.
Это звучит как тестовый пример, и исправление работает! Итак, надеюсь, что кто-то из вас, возможно, столкнулся с этим, это помогает!
Спасибо