Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error in Global ASAX: File Does Not Exist

I am trying to understand what error occurred that sent me to the Global ASAX OnError handler.

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;

Here is my Exception converted to a 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)"

How do I determine what line of code is causing this error? I tried to set my Debug options to break when the error occurs, but it didn't , I still end up in the ONERROR global handler.

One thing is that I see that the code assumes that there will be an Inner Exception, and this appears to be NULL and is causing a second error within the handler.

I assume that the error is occuring somewhere in compiled code. I checked the Web.Config, and the only paths mentioned there is a Log Path, and that seems valid and logging appears to be working.

Update I found some additional information here:

How to solve exception "File does not exist"?

When I check this in the Immediate window:

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

However, what puzzles me is that I search my entire solution looking for favicon.ico using "Find In Files" and I see no reference.

Why am I getting an error that the icon file is not found when I see no reference to it? I'm guess some assembly is using it? But why is it looking for it in the web root?

like image 617
Chad Avatar asked Jan 28 '13 20:01

Chad


1 Answers

The request for favicon.ico is being blindly made by most modern browsers and they are expecting a 404 (File Not Found) if there is no favicon (this is proper behaviour). Below you can find a quote from HTML5 working draft regarding Link type "icon" :

In the absence of a link with the icon keyword, for documents obtained over HTTP or HTTPS, user agents may instead attempt to fetch and use an icon with the absolute URL obtained by resolving the URL /favicon.ico against the document’s address, as if the page had declared that icon using the icon keyword.

The reason why you see the exception is that the web development server or IIS configured to use Managed/Integrated Pipeline Mode puts all requests through Global.asax (including errors).

You can try to prevent the browsers from making the requests by creating following dummy link to favicon:

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

You also might try one of following:

  • Add following line at beginning of RegisterRoutes method:

    routes.IgnoreRoute("favicon.ico");

    or even more extended version:

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

  • Create yourself an empty file for favicon
  • Filter out the errors by checking HttpException.GetHttpCode() for 404 and ((System.Web.HttpApplication)Sender).Context.Request.Url for /favicon.ico.
like image 105
tpeczek Avatar answered Oct 17 '22 02:10

tpeczek