全局ASAX中的错误:文件不存在

时间:2013-01-28 20:02:45

标签: asp.net debugging

我试图了解发送给我的全局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;

这是我的异常转换为String

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,并且提到的唯一路径是一个日志路径,这似乎是有效的,并且日志记录似乎正在工作。

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

How to solve exception "File does not exist"?

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

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

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

为什么我看到没有找到图标文件的错误时会收到错误?我猜有些装配正在使用它?但是为什么要在网络根目录中寻找呢?

1 个答案:

答案 0 :(得分:15)

大多数现代浏览器都盲目地提出了对favicon.ico的请求,如果没有favicon(这是正确的行为),他们期望 404(找不到文件)。您可以在下面找到关于Link type "icon"的HTML5工作草案的引用 :

  

在没有带有icon关键字的链接的情况下,获取的文档   通过HTTP或HTTPS,用户代理可能会尝试获取和使用   带有通过解析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 的HttpException.GetHttpCode() /favicon.ico ((System.Web.HttpApplication)Sender).Context.Request.Url来过滤掉错误。