让我们从一些背景信息开始。我正在运行一个非常简单的 ASP.net MVC Azure 云服务(一个 Web 角色,带有 IIS 8.5 的 Windows Server 2012 R2)。该服务从 Flash 客户端接收统计信息,该客户端大约每 10 秒发布一次数据(对于可能非常大量的客户端)和 JavaScript。该服务包含的所有内容是一个带有两个简单操作和一堆参数的单个 Controller (代表以各种组合发送的单个统计信息)。该服务所做的只是设置 CORS 和 cookie 响应(客户端/JavaScript 可以嵌入到随机域中),验证接收到的数据的完整性,然后将其存储到 Azure 表存储帐户中。
为了确保我们的服务以最佳方式运行,我们使用 New Relic 来跟踪服务性能,并且为了确保我们的数据是准确的(即我们成功记录了所有收到的消息),我们实现了自定义错误处理解决方案,以便我们可以解决任何问题/可能出现的错误。
我们已经使用 jmeter 对我们的服务进行了负载测试并且没有遇到任何问题,但是现在我们已经部署到一个实时环境并且正在使用我们的服务,我们开始遇到偶尔的 500 个内部服务器错误(大约 5% 的请求)。最大的问题是我们自己的错误处理代码没有检测到这些错误,但是 New Relic 确实报告了某些生成 500 内部服务器错误的请求(没有像堆栈跟踪这样的进一步信息,有时有,有时没有报告的参数)。
我们的自定义错误处理包含一个注册到 AppDomain.CurrentDomain.UnhandledException 和 context.Error 事件的 HTTP 模块。从理论上讲,这应该捕获(然后记录)我们自己的代码中尚未捕获(并记录)的任何异常。相关的 web.config 部分配置如下:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
<error statusCode="404" redirect="~/404.aspx" />
<error statusCode="500" redirect="~/500.aspx" />
</customErrors>
和
<httpErrors existingResponse="Replace">
<clear />
<error statusCode="404" path="404.html" responseMode="File" />
<error statusCode="500" path="500.html" responseMode="File" />
</httpErrors>
<modules>
<add type="namespace.UnhandledExceptionModule" name="UnhandledExceptionModule" preCondition="managedHandler" />
</modules>
然而,这种情况并非如此。我尝试打开各种日志记录,但 IIS 日志无用(它们只显示返回 500 响应,但没有其他有用信息)。我能够收集的唯一有用信息是来自失败的请求跟踪,但我无法从该信息中确定实际问题是什么(谷歌搜索错误代码或异常不会导致任何具体结果)。可以在此处找到失败跟踪的相关部分的屏幕截图:
http://i57.tinypic.com/20acrip.jpg
我还在这里上传了完整的跟踪:
http://pastebin.com/fDt3thvr
每个失败的请求都会生成完全相同的日志,因此我们看到的错误始终是由相同的问题引起的。但是,我无法确定这个问题是什么,更不用说找到解决它的方法了。即使我有错误代码和消息,谷歌搜索它们也只会返回关于 6 年前已修复的问题的非常古老的主题。
对于我们的业务来说,可以高度准确地记录这些消息非常重要,但就目前而言,我对如何获得有关这些服务器上正在发生的事情的更好信息没有进一步的想法。我们也无法在受控环境中复制这种行为。
此外,我们的错误记录本身确实可以正常工作。 “正常”错误按预期记录,我们还验证了 HTTP 模块确实有效。
编辑:
Controller 伪代码如下:
[HttpPost]
public ActionResult Method(...)
{
// Set cookie and CORS reponse, check for early out.
if(earlyOut)
return 404;
// Store received values.
azuretable.ExecuteAsync(TableOperation.InsertOrMerge(...));
return 200;
}
编辑2:
我花了一些时间分析失败的请求跟踪,它们似乎大多是由使用 IE9 的用户生成的。实际上,我设法通过在加载页面时快速离开页面来重现错误 2 次,因为问题似乎是由中止的 Ajax 调用引起的(我们在页面加载期间充分利用了它)。为什么一个中止的调用会导致 500 错误而不是被整齐地处理?
最佳答案
cookie 是否超过 4k?我们在 IIS 上也发生了同样的事情,请求有时会以 500 Internal Server 错误结束。这些错误几乎无法追踪。
我通过简单地将 cookie 膨胀到 4093 字节限制来重现该问题。
关于asp.net - Azure 云服务上的间歇性 ASP.net IIS8.5 无法捕获 500 internal-server-error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201324/