繁体   English   中英

MVC 4-上载到IIS 7.5后在IE中不起作用

[英]MVC 4 - Upload Doesn't Work in IE When deployed to IIS 7.5

仅当我将其部署到实时服务器上时,才会出现此问题,它在Visual Studio Web服务器上的开发机上可以正常工作,并且仅是IE中的问题(均为8和9)

使用此表单发布jpeg ...

<form method="post" id="uploadForm" enctype="multipart/form-data" action="/ImageUpload/UploadImageNew">
   <input type="file" onchange="postFile()" name="file"></div>
   <input type="submit" value="OK">
</form>

使用此javascript ...

function postFile(ctrl) {
    document.getElementById('uploadForm').submit();
}

对于此控制器...

[HttpPost]
public ActionResult UploadImageNew(HttpPostedFileBase file)
{
    // Verify that the user selected a file
    if (file != null && file.ContentLength > 0)
    {
        file.SaveAs("AFilename.file");
     }
     else
     {
         throw new Exception("File not found")
     }
     return View("UploadImageNew");
}

在IE中结果为file.ContentLength = 0,但在FF和Chrome中工作正常,如果有任何区别,则该机器位于我们的Intranet上。

任何帮助,不胜感激

更新1:

奇怪的是,问题似乎是断断续续的,星期五,我的同事无法上传任何东西,但我可以上传,今天早上是我不能和我的同事都可以使用IE。

一切似乎都指向IIS配置问题?

更新2:

好的,看来我的问题与过期的会话/安全性有关。 我正在使用混合身份验证方法,这导致了我的问题。

主站点使用表单身份验证,但是我还有另一个站点可以为我执行Windows身份验证并设置Cookie,因此禁用此功能可以解决我的问题。

不知道为什么,但是我认为这在另一个问题上会更好。

我将smartcaveman的答案标记为正确的答案,因为他的职位将我引向正确的答案/解释。

您的问题与IIS无关。 它已断开,因为您正在使用change事件进行连接。 IE和change事件存在已知问题。 quirksmode上可以找到一张表,该表具有与不同浏览器的兼容性,并且具有与此事件相关的不同HTML元素。

以下是有关该主题的几篇博客文章:

对我而言,最明显的方法是使用blurfocus方法。 (记录一个焦点的值,检查模糊的值,以及是否不同提交)。

更新

所以,它仍然无法正常工作? 这里还有一些其他值得研究的东西。

  1. 如果在提交之前尝试从客户端的表单字段获取值,会发生什么情况。 例如function postFile(ctrl) { alert(document.getElementById('uploadForm').value); return false; } function postFile(ctrl) { alert(document.getElementById('uploadForm').value); return false; } function postFile(ctrl) { alert(document.getElementById('uploadForm').value); return false; } 有价值吗? 此外,您是否已确认该功能可在没有JavaScript的实时环境中使用? (例如,只需正常提交表格即可)。 如果是这样,则可以确定问题出在前端。 如果不是这样,那么JS很好,问题出在后端。

  2. 最大请求长度/最大内容长度。 在对您的帖子的评论中,您说您已在maxRequestLength中启用了2GB。 但是,此方法在IIS7中的工作方式与在IIS6中的工作方式稍有不同(如果是以前的测试环境,则为Casini)。 有关详细信息,请参见本博客 ,但总而言之,您需要确保web.config在system.webServer部分中具有该设置,并且该值实际上代表您的想法。 详细信息在文章中。

  3. 您是否正在使用异常处理和/或日志记录功能? 您是否可能在某个地方吞下了导致请求被放弃的异常? 是否有任何空的try - catch块可能会保护您的视图免受潜在错误的影响,否则可能导致请求失败? 如果确实启用了日志记录,是否可以区分尝试的使用和您的同事之间的区别?

  4. 实时站点上的文件结构与您的开发环境有什么不同吗? 我注意到您有一个硬编码的表单操作/ImageUpload/UploadImageNew目标,这可能会影响应用程序匹配传入路由的能力。

  5. 您在评论中说内容长度为0,但是如果您用来确定它的测试是帖子中的内容,则您可能是错误的。 您的测试等效于file == null || file.ContentLength == 0) file == null || file.ContentLength == 0) 根据实际情况,会有不同的含义。 如果文件为空,则可能与模型绑定有关。 如果内容长度为0,则它​​至少识别出正在发送文件,但是在决定如何处理时出现了问题。 您可以通过遍历HttpContext.Request.Form集合并写出值来检查是否真正接收到文件数据(这就是ASP Classic时代的做法)。 一篇文章, Valum文件上载-在Chrome中工作,但在IE中不工作,Image img = Image.FromStream(Request.InputStream)表示,具有相同问题的用户在Request.Files集合中找到了文件内容。 您必须先检查才能知道。 无论如何,如果文件数据位于其中之一,则您知道模型绑定中正在发生问题(并且您知道解决方法,直到找到正确的解决方法为止)。

  6. 我还在Telerik论坛上发现了一些东西,这些东西似乎描述了与它们的组件相似的事情(实际上只是您所做工作的包装)。 它指出可能的会话超时。

我建议仔细检查这些项目,看看其中是否有任何更多有关该问题的信息(至少肯定是第一名)。

上一次,当我编写基于Ajax的UI时遇到同样的问题。我使用ajax上传文件。

不确定,但是尝试这些链接可能会有所帮助

Ajax文件上载在IE7中 不起作用Valum文件上载-在Chrome中可用,但在IE中不起作用,图像img = Image.FromStream(Request.InputStream)

http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx

您是通过ajax还是通过表单提交来保存postFile()文件? IE不会像chrome和firefox那样使用(上传的)文件名。 进行上传调试时,请检查代码并检查它们是否存在。

在IE11上为我工作的简单解决方案: 启用兼容模式

出于某种原因,IE11对我的上载端点执行了两个请求...一个不带文件,可以正常工作并返回200状态(但是由于它没有文件,因此对我无用),另一个请求与文件...但是第二个总是在IE中“开发人员工具”的“网络”标签上。 我找不到这种奇怪行为的原因。 看着服务器上的日志,我发现第二个请求从未命中服务器。

但是,这并不能解决每个人的问题,因为您必须要求系统的每个用户都为您的网站启用兼容模式...而且向Internet用户提出要求不是一件好事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM