.net - MVC3 HttpPostedFileBase 第一次上传不提供数据,但随后执行

标签 .net asp.net-mvc asp.net-mvc-3 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-latest 和 IE8/9 按预期工作。 Fiddler 日志显示相同的行为,主要区别在于第二次 401 授权检查不会发送表单有效负载乱码,并且按预期工作。

这听起来像是一个测试用例,并且正在修复中!所以,希望对于你们中的任何一个可能遇到过这种情况的人,这会有所帮助!

结束 TLDR

我有一个 Controller Action ,它只接收一个上传的文件,它是一个“事件”的 CSV 文件。在幕后,这个 CSV 被解析出来,变成事件对象,数据在数据库中同步。作为结果输出,系统会提示用户下载 Excel 电子表格,其中包含发生的每一行的所有错误。

这一切在我的开发机器上本地运行良好。然而,一旦部署到 DEV 环境,我就会得到不同的结果。第一次尝试上传文件会导致流,我在这里寻找的词是什么,不可读?它正确地报告了它的长度,但试图提取信息却一无所获。后续读取确实有数据,一切都按预期工作。

我会给你相关的代码图片。首先,简化了 gen'd 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>

非常直接:

Controller 操作(请原谅我搞砸了几个小时):
[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);

目标是将 textreader 或 stringreader 传递给服务方法,因为在幕后这是使用需要这些类型的 CSV 处理实现。

任何想法为什么第一个请求失败但后续工作?我觉得我需要一双新的眼睛,因为我的想法已经枯竭。

最后一点,IIS 7.5 是本地通过 IIS Express 和目标服务器上的目标。

谢谢

编辑 赏金:

我在这里复制我的赏金信息和每个请求的 Fiddler 输出

我已经对这个问题添加了一些评论。该问题似乎与 NTLM 相关。我在 Fiddler 中看到的是具有有效表单数据的 401 Unauthorized on request 1(我的理解是,在仅启用 Windows 身份验证的情况下,前两个 401 Unauthorized 请求是“正常的”;请验证?)。列出的请求 2 再次是具有相同表单数据的 401,除了上传的文件数据现在只是一堆盒子,大小完全相同的数据,而不是完全相同的上传数据。请求 3 是一个包含乱码数据的 200 OK,这就是我的 Controller 操作得到的结果。如何让 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 授权检查不会发送表单有效负载乱码,并且按预期工作。

这听起来像是一个测试用例,并且正在修复中!所以,希望对于你们中的任何一个可能遇到过这种情况的人,这会有所帮助!

谢谢

最佳答案

这只是一个尝试的想法。请注意,StreamReader 有许多构造函数:

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

在某些构造函数中,它尝试自动检测编码(如果已指定),如果无法检测到,则返回到指定的编码。使用的构造函数使用 UTF-8 编码。您可以更改构造函数以自动检测编码,如果不是,则使用 UTF-8。

关于.net - MVC3 HttpPostedFileBase 第一次上传不提供数据,但随后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644367/

相关文章:

.net - Visual Studio : Simultaneously develop WCF client and server

.net - 用于存储密码并随后检索的字符串加密

c# - Ninject BindFIlter<> 中 FilterScope 参数的用途是什么?

javascript - 如何在鼠标悬停时显示所有 div 的内部图像标题?

jquery - asp.net mvc 3 razor 文件上传

c# - Windows Azure/SQL Azure 上 Entity Framework 中的动态数据库/架构

.net - 在 WPF 中应用主题时不显示 Listview 复选框

c# - 开源 .Net Jabber/XMPP 服务器?

c# - Asp.Net MVC Smtp 尝试中的 SSL 错误

asp.net-mvc-3 - asp.net mvc3,为什么我们使用存储库模式时需要服务层