问题的背景。
编辑 3 我可以验证这似乎在 Chrome 20 中再次起作用。谢谢!
TLDR 更新
编辑 2 经过进一步的研究,这似乎是 Chrome 19 中的一个错误。请参见此处:
没有什么比最新的错误更重要了!:-)
Firefox 最新版和 IE8/9 可以正常工作。Fiddler 日志显示了相同的行为,主要区别在于第二次 401 授权检查不会发送乱码的表单有效负载并且它按预期工作。
这听起来像是一个测试用例,并且正在修复中!因此,希望对于可能遇到此问题的任何人来说,这会有所帮助!
结束 TLDR
我有一个控制器操作,它只接收一个上传的文件,它是一个“事件”的 CSV 文件。在幕后,这个 CSV 被解析出来,变成事件对象,数据在数据库中同步。作为结果输出,系统会提示用户下载一个 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 本地和目标服务器上的目标。
谢谢
编辑赏金:
我在这里复制我的赏金消息和每个请求的 Fiddler 输出
我对这个问题添加了一些评论。该问题似乎与 NTLM 有关。我在 Fiddler 中看到的是带有有效表单数据的请求 1 上的 401 Unauthorized(我的理解是,在仅启用 Windows 身份验证的情况下,前两个 401 Unauthorized 请求是“正常的”;请验证?)。列出的请求 2 再次是具有相同表单数据的 401,除了上传的文件数据现在只是一堆框,完全相同大小的数据,只是不是确切的上传数据。请求 3 是包含乱码数据的 200 OK,这就是我的控制器操作得到的结果。如何让 NTLM 与文件上传配合得很好?
这是每个请求的 Fiddler 输出:
要求 1)
要求 2)
最后请求 3 即已处理的 HTTP 200 OK
编辑 2 经过进一步的研究,这似乎是 Chrome 19 中的一个错误。请参见此处:
没有什么比最新的错误更重要了!:-)
Firefox 最新版和 IE8/9 可以正常工作。Fiddler 日志显示了相同的行为,主要区别在于第二次 401 授权检查不会发送乱码的表单有效负载并且它按预期工作。
这听起来像是一个测试用例,并且正在修复中!因此,希望对于可能遇到此问题的任何人来说,这会有所帮助!
谢谢