在ASP.NET Web应用程序中有未处理的异常是否可以接受?

时间:2010-07-20 19:34:31

标签: asp.net asp.net-mvc iis-7

我正在与第三方供应商合作,他们提供了一个ASP.Net网络应用程序。该网络应用程序每天生成大约200个未处理的例外,最终作为我的收件箱中的电子邮件。经过调查发现,大多数这些错误都是由GoogleBot网络抓取工具索引网站并触发对另一个第三方网络服务的访问而触发的,这对请求进行了速率限制。当超出请求限制时,第三方Web服务拒绝该请求,这将导致Web服务器中的未处理异常和HTTP / 500状态代码。例外情况如下:

Exception: Exception of type 'System.Web.HttpUnhandledException' was thrown., Stack Trace:    at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.views_products_detail_aspx.ProcessRequest(HttpContext context)
   at System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext)
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.c__DisplayClass11.b__e()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

网络应用开发人员似乎不愿意处理这些错误,原因我并不理解。他们的方法是限制谷歌博客,直到错误停止发生(谷歌索引相当aggressivley,每天产生约5,000次点击)。虽然我接受限制GoogleBot会起作用,但对我来说这似乎是个问题。我一直认为未处理的异常是错误。 Web应用程序不应该处理这些错误吗?允许HTTP / 500发生永远可以接受吗?那里的网络开发者会怎么想?

6 个答案:

答案 0 :(得分:3)

这里真的有几个问题:如果网站显示异常(否),网站是否应该向用户显示更友好的内容(是),如果网站向Googlebot返回500错误如果无法继续(可能),如果您要求Googlebot放慢速度(是),您是否应该每天发送500封例外电子邮件,而不会进行限制或摘要(可能不会)。

更多细节: -

使用google.com/webmasters,您可以请求Google不那么积极地为您的网站编制索引。

您永远不应该向用户显示异常,您应该始终捕获它并显示友好的错误页面但是当您显示该页面(例如404或500)时需要小心保留HTTP代码,因为如果您返回在代码= 200的页面中,该错误页面将进入搜索引擎索引。

任何错误处理程序都应该限制发生错误时发送电子邮件的频率。

编写良好的错误处理程序还应该允许抑制您知道会发生的错误 - 例如某些搜索引擎坚持要求不存在的页面。

如果谷歌可以让你进入速率限制的情况,那么来自用户的高流量也许可以做同样的事情,所以整体而言你也需要某种缓存解决方案。

答案 1 :(得分:2)

不,这是不可接受的。 Web应用程序至少应该捕获global.asax.cs中的异常并对它们做一些合理的事情。

答案 2 :(得分:2)

Web开发人员不愿意在 Web服务中处理异常?

这是相当可怕的,因为Web服务可能导致异常的原因有很多很多。如果Web服务不可用,请尝试让开发人员允许应用程序正常降级,而不是要求修复GoogleBot问题。

答案 3 :(得分:1)

IMO这实际上是可以接受的。问题是您已达到服务饱和点。有两种方法可以解决这个问题:花费金钱和时间来增加饱和点并分配更多服务花费时间和金钱让自己不依赖于所述服务。

编辑还有第三个选项可以跟随纽约时报的脚步,将谷歌视为您服务的小偷,并禁止它们。当然,这真的就像把头放在沙子里,但这是一个选择。

答案 4 :(得分:0)

网络应用程序通过电子邮件处理错误。

我想知道的是,如果真正的人工网站访问者遇到此错误,您希望如何处理?我想如果一个真正的人类访问者遇到这个错误,你会想要通过电子邮件发送。也许其中一些错误来自真正的人类访问者,因为Google用完了他们的配额?

似乎您需要一种更优雅的方式来确保网站在没有第三方服务的情况下进行扩展。我不清楚哪个供应商(ASP.NET开发人员或第三方服务)应该使用它,但这更像是一个项目管理问题。

答案 5 :(得分:-1)

发生了供应商无法控制的情况。供应商已记录错误并向您发送通知。供应商无法控制对Web服务的限制或您网站的访问者数量。你可以控制两者。

除非规范声明电子邮件应以某种方式受到限制,否则供应商的立场是合理的。你想要完成工作,你付出了代价。

所以你有三个选择

  1. 以某种方式限制谷歌;
  2. 扩展您的网络服务津贴;或
  3. 支付要更改的网站。