7

我试图了解发生了什么错误,将我发送到 Global ASAX OnError 处理程序。

using System;
using System.Web;

namespace GLSS.Components.HttpModules
{
  public class ExceptionModule : System.Web.IHttpModule 
  {
    private void OnError(object sender, EventArgs e)
    {
      HttpContext context = HttpContext.Current;

      //get the last error
      Exception ex = context.Server.GetLastError();
      if(ex.InnerException.GetType().ToString() == "CSLA.DataPortalException")
        ex = ex.InnerException;

这是我的异常转换为字符串

HttpContext.Current.Server.GetLastError().Message
"File does not exist."
HttpContext.Current.Server.GetLastError().StackTrace
"   at System.Web.StaticFileHandler.GetFileInfo(String virtualPathWithPathInfo, String physicalPath, HttpResponse response)
at System.Web.StaticFileHandler.ProcessRequestInternal(HttpContext context)
at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)"

如何确定导致此错误的代码行?我试图将我的 Debug 选项设置为在错误发生时中断,但它没有,我仍然在 ONERROR 全局处理程序中结束。

一件事是我看到代码假定会有一个内部异常,这似乎是 NULL 并导致处理程序中的第二个错误。

我假设错误发生在编译代码的某个地方。我检查了 Web.Config,唯一提到的路径是一个日志路径,这似乎有效并且日志记录似乎正在工作。

更新 我在这里找到了一些额外的信息:

如何解决异常“文件不存在”?

当我在“立即”窗口中检查时:

? HttpContext.Current.Request.Url.ToString()
"http://localhost:2322/favicon.ico"

然而,令我困惑的是,我使用“在文件中查找”搜索我的整个解决方案以查找 favicon.ico,但我没有看到任何参考。

当我没有看到对图标文件的引用时,为什么会收到找不到图标文件的错误消息?我猜有些组件正在使用它?但是为什么要在网络根目录中寻找它呢?

4

1 回答 1

15

大多数现代浏览器都盲目地发出对 favicon.ico 的请求,如果没有 favicon(这是正确的行为) ,他们会期待404(未找到文件)。您可以在下面找到 HTML5 工作草案中关于链接类型“icon”的引用 :

在没有带有 icon 关键字的链接的情况下,对于通过 HTTP 或 HTTPS 获取的文档,用户代理可能会尝试获取并使用具有绝对 URL 的图标,该绝对 URL 是通过将 URL /favicon.ico 与文档地址解析获得的,就好像该页面已使用 icon 关键字声明了该图标。

您看到异常的原因是配置为使用托管/集成管道模式的 Web 开发服务器或 IIS将所有请求都通过Global.asax(包括错误)。

您可以尝试通过创建以下指向 favicon 的虚拟链接来阻止浏览器发出请求:

<html>
    <head>
        <link rel="shortcut icon" href="#" />
        ...
    </head>
...
</html>

您也可以尝试以下方法之一:

  • 在方法的开头添加以下行RegisterRoutes

    routes.IgnoreRoute("favicon.ico");

    甚至更扩展的版本:

    routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});

  • 为自己创建一个 favicon 的空文件
  • 通过检查404和/favicon.icoHttpException.GetHttpCode()来过滤掉错误((System.Web.HttpApplication)Sender).Context.Request.Url
于 2013-02-04T15:38:49.317 回答