ASP.NET MVC 页面不通过 3G 或某些代理服务器提供服务

Posted

技术标签:

【中文标题】ASP.NET MVC 页面不通过 3G 或某些代理服务器提供服务【英文标题】:ASP.NET MVC pages aren't served over 3G or certain proxy servers 【发布时间】:2012-05-18 20:32:00 【问题描述】:

我们刚刚推出了一个新的基于 ASP.NET MVC 的网络应用程序,它可以在所有桌面连接和所有移动设备(如 iPhone 等)上正常运行。但是,当通过 3G 连接查看某些页面时(无论是通过笔记本电脑上的 3G 加密狗,或直接在移动设备上),提供一个空白的白色页面,没有任何类型的内容。看起来好像我们返回了一个空请求。

在某些代理网络上,我们遇到了类似的问题,他们说我们的请求过大。这是有道理的,因为它只影响某些页面,我会假设移动网络提供商在他们身边运行各种代理服务器。

但是,我无法找到任何信息来说明什么会构成请求过大。我已经分析了其中一个页面,以下是一些我认为可能相关的统计数据:

HTML 内容大小: 33.04KB 压缩,50.65KB 未压缩所有样式表的总大小(4 个文件): 32.39KB 压缩,181.65KB 未压缩所有外部 JS 的总大小(24 个文件): 227.82KB 压缩,851.46KB 未压缩

对我来说,内容的压缩大小并不过分,但也许我错了。任何人都可以建议我可以做些什么来解决这个问题,因为我很难找到任何明确的信息。

【问题讨论】:

您是否输入了未压缩 CSS 的大小?我当然希望如此。 我做到了,对此感到抱歉。现已修复 你试过关闭压缩吗?可能是您的 Web 服务器正在以某些 Web 代理或 3G 网络中介无法处理的方式实施压缩。至少,分享一下压缩是如何设置的,这样我们就可以看看这是否是问题所在。 @Jacob 这是一个有趣的想法。我们启用了 GZIP 压缩,这导致我们的一些客户端在 Windows XP 客户端上出现问题。我手头没有我们压缩设置的全部细节,但我会询问我们的基础设施人员并确认。我不认为这是一种选择。 @Jacob - 不幸的是,在我们的服务器上禁用压缩并不能解决问题。 【参考方案1】:

就 MVC 而言,3G 网络与 Wifi 没有什么不同。但是,移动设备可以缓存的文件大小是有限制的。在这种情况下,每次回发都会从服务器请求这些文件。

由于某些页面确实有效,我认为将问题隔离到特定的故障点比在野外搜索是个好主意。

您可以在 Firefox 或 Chrome 开发者工具中使用 3G 加密狗和 firebug 轻松调试问题

首先确保没有导致问题的 Java Script 错误 确认 javascript/css/html 文件确实已交付给客户端。 (客户端上的萤火虫)。在服务器上检查 IIS 日志或 MS 网络监视器或创建一个 http 代理,您可以在其中监视流量。尝试任何你觉得舒服的。 仅对 css/java script/html 的请求就有近 30 个,如果您有图像,请求数可能会更高。在 3G 上完成所有这些请求可能需要很长时间。尝试捆绑 Java Script 文件并减少请求计数。浏览器对它们可以同时发出的请求数量有限制,这增加了所有时间(我相信 Firefox 可以同时发出大约 10 个请求)。

【讨论】:

感谢您的建议。问题是,我们的 JS/CSS 加载目前还没有得到高度优化,所以我们在网站的每个页面上提供完全相同的、最小化和捆绑的 JS 和 CSS 有效负载。对我来说,这排除了它与 JS/CSS 相关的可能性。我还假设它排除了缓存/加载问题,因为相同的移动设备在 WiFi 连接上都很好,等等。我的假设是它必须与初始 HTML 数据包的大小有关,但我找不到任何信息来确认如果这可能是一个问题,如果是,那么该大小限制是多少。【参考方案2】:

我们确实解决了这个问题,它取决于响应标头中 Set-Cookie 项的大小和数量。我们发现我们有一个错误,即标题中有近 100 个 Set-Cookie 项。解决此错误并减小值的大小修复了该问题

【讨论】:

以上是关于ASP.NET MVC 页面不通过 3G 或某些代理服务器提供服务的主要内容,如果未能解决你的问题,请参考以下文章

仍然可以在 ASP.NET mvc 中使用 Session 变量,或者对于某些事情(比如购物车)有更好的选择

如何防止 ASP.NET MVC 应用程序中的 DoS 攻击?

ASP.NET MVC RedirectToAction 不刷新页面

ASP.NET MVC 下的 SSL 页面

在 ASP.NET MVC 5 中从数据库加载 Razor 视图

ASP.NET MVC:部分知道它是否从另一个页面带来请求?