Configuration :: Handling Errors In Global.asax - Application_Error Fires Twice
May 25, 2010
I am handling errors in Global.asax. When I encounter an error in certain pages, the Application_Error event fires twice. On the second trip, Server.GetLastError() returns null. I have a simple page where I throw an error in page load. When that page throws an error the code below works fine. I also have a more complex page with an update panel and many controls. When that page throws an error Application_Error fires twice. I suspect the update panel but update panels are always suspect, right?
There are no try/catch blocks on any of my pages I'm testing with. Custom errors in web.config is commented out. Note that logging and busywork in the Application_Error event are commented out. I'm pretty much just doing a respone.redirect. The problem with the the event firing twice is that the response.redirect fails with an error msg stating that headers have already been sent (adding Context.ClearError and Response.Clear does nothing to fix that).
Fine and dandy... I like that mode="RemoteOnly" facilitates development...
For unhandled exceptions, I have in global.asax:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Response.Redirect("GenericError.aspx") End Sub
However, unhandled exceptions are going to the generic error page instead of the informative yellow screen of death preferred by developers. I can comment out the redirect in global.asax, but then I need to remember to change it for the production environment. Is there a way I can check in Application_Error whether I am remote or not to determine whether to redirect?
I'm trying to handle all my application exceptions inside the global.asax but from some reason it's not firing at all, i never tried to do it before so i guess i'm doing something wrong here...
here is the code inside the default.aspx page that throw the error:
Just for kicks, how do you say, wire up an ASP button to purposely throw an Application_Error exception in the global.asax file?
lets say you wanted to test the functionality of the error handling and what is doing..and you don't have a real error to do it. what is the easiest way just raise this event?
Looking for best practice focused answers here with explanations.
Should the presentation layer of an ASP.Net app catch and handle exceptions thrown from the business layer, or should these be allowed to bubble out, where they can all be logged and handled uniformly in the Global.ascx's Application_Error handler?
So I handle all exceptions in my project within my Global.asax page. For example, on a random page I could have:
[code]....
So my question is in the Application_Error method, do I need the try/catch block when trying to write to the database? I'm thinking I would in case something goes wrong with the connection, etc. - but is this really necessary? Also, what would I do in the catch block if there is an error? At that point I would be catching the error of logging an error which is confusing in its own right.
I'm working on a small web application, and I wanted the user to be redirected to a simple error page anytime an exception was encountered. So I wanted to redirect the user to generic Error page "Oooops.aspx" that will log the error in page_load.
I'm thinking that I can use Application_Error in Global.asax, where I can redirect to "Oooops.aspx" so that it displays a friendly error page and it logs the exception (through Server.GetLastError()). I can also use web.config and add "<customErrors mode="On" defaultRedirect="Oooops.aspx"/>" It'll redirect me to a friendly error page and it will also log the exception. What's the difference between these two? Should I use both of them, or just one? And which should I use?
I'm getting a very peculiar problem with my asp.net application, it took me an age to track down but I still don't know what is causing this behaviour.
If I set a session variable in the Application_PreRequestHandlerExecute event, then my external JavaScript files are ignored, and therfore causing a raft of errors. I have simplified the problem below.
E.g.
I have file called JScript.js containing the code:
function myAlert() { alert("Hi World"); }
And in my Default.aspx file I reference the js with the code:
And in the body onload event I call the myAlert() function:
<body onload="myAlert()">
And finally in the Global.asax file:
Private Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs) HttpContext.Current.Session("myVar") = "MyValue" End Sub
If you run the Default.aspx file you will see the js function isnt called, however, if you comment out the line of code Global.asax then the external js is called and the function executed when the page loads.
I have a hosting account on DailyRazor.com , i use Global.asax in my project to start a schedule process in Application_Start.When i just publish my website, and upload it, the Application_Start does not Fire, but when i upload the Global.asax to my host it gives an Error but the Applicaiton_Start Event fires up, and then i delete the Global.asax file and everything works.just wondering, What am doing wrong ? or why this meaningless thing happens?
I have 2 versions of the same website, one compiled and the other one just plain code.The plain code website correctly inserts these records in the db, but the compiled one is not doing it.
I have a feeling the Global.asax file is being ignored by the compiled website. I can see the dll for it in the in folder: App_global.asax.compiled and App_global.asax.dll although I can't see a Global.asax file in the root folder (do I need one?)
I must say the website is compiled with MSBuild and then obfuscated using Dotfuscator.
I want to make sure of one thing. I have implemented the Application_Error() method of Global.asax. In my application some where I have a try catch. If an exception is trown and that exception is handled by a catch block. Does this envoke the Application_Error() method in the global.asax
i have written in the "Application_BeginRequest" Method that the header of every HTTP Request will be analyzed.
It only works when i visit the myip/default.aspx site. But when i want to visit any other site there will be no entry in the database or in the listbox (the listbox is only for me to see what happens)It runs on an IIS 5.1.
I also changed in the IIS Settings the ASP.NET from 2.0 to 4.0. Do i need to configure the IIS 5.1 to use the global.asax.cs on every url?
I thought the global.asax.cs runs on every site on the webserver.
I have recently published my website, it worked fine but the only issue is that the error handling code in the global.asax never works. It works when I tested the website on my localhost but not when it is deployed onto my hosting provider.
I tried moving my global.asax file onto my root directory (not the bin) on the hosting folder, then my whole website wouldn't even start. I get the error message "System.Web.HttpException: This server variable cannot be modified during request execution."
But if I remove the global.asax, then it is running fine again.
Note: I didn't use the publish function in Visual Studio to publish my website, I sent the files over one by one via cPanel. Note: I googled about this, a lot of them are saying about global.asax being precompiled into a dll, but I can't find that dll in my local computer.
I have the same issue, I have added the On before the Application start, or Session Start and it is still not working.Application_OnStart or Application_Start is not firingSession_OnStart or Session_Start is not firing..Note that in my development environment it is firing (both of the names).When I am adding the Global.asax file, there is only one file (no .cs file). And when I am publishing the project, I am not getting the Global.asax file, I am getting a xxxxGlobal.asax.dll file on my bin folder...
I've put together some code that processes XML files as they're uploaded to the server using the FileSystemWatcher for one of my clients. The XML is uploaded every hour, and the FSW watches a set directory for new files. All is well and works fine in my development environment but I'm using my clients hosting provider (www.webhostforasp.net) and when uploading a new XML file it appears that nothing is happening? It is possible that the hosting provider doesn't allow watchers or calls from the Global.asax?
What would be the best way to find out what's going on there, considering that without running the site in debug mode, I've got no way of knowing what's going on with the Global.asax or the FSW?
When I start debugging my application using vs2010 before the default.aspx page is rendered the application_error event is fired in global.asax.
There is nothing happening in the page_load of the default.aspx screen.However, if I set a break point on the default.aspx page_load event and the application_error event here are the sequence of events: The page_load event of default.aspx is fired, there is no code to execute there so I hit F5 to continue. The application_error event is then fired.Here are some of the details from Server.GetLastError();
exception message is "File does not exist."
stack trace:
at System.Web.StaticFileHandler.GetFileInfo(String virtualPathWithPathInfo, String physicalPath, HttpResponse response) at System.Web.StaticFileHandler.ProcessRequestInternal(HttpContext context, String overrideVirtualPath) [code]...
I have absolutely no idea why this event is fired. Do all of the events in the Global.asax get fired on startup?There is nothing happening on the page_load so how can an error be thrown?
I have a hosted site and just added some additional error notification to my global.asax file and works like a charm. I decided to add the same logic to our test server and it doesnt work. The server.transfer never happens and the email never gets updated. Now i know the email works on the test and production server since we have other pages that use the same SMTP server name and setup as i have in the global file. Below is my code as it is in the file now. I setup a test page to cause an error and the page displays the detailed error which we dont want. But i would like to be notified if this happens. What am i missing? I can only assume that its a IIS confige issue, since the exact same code works on a hosted site, but not at work on our test or production servers. Here is the code i have in the global.asax
When I run my app locally I get no errors. No error from Global.asax, no redirection to an error page. Everythings works fine.
When I deploy my app to a test server, my app run there with no errors. No error from Global.asax, no redirection to an error page. Everythings works fine on the test server.
But when I deploy my app to production server, the app runs fine but I keep getting errors (emailed to me) from Global.asax. On production server we have these security apps that run and keep hitting all URLs of the app on the server. Just to make sure they are working fine. When these security app hit URL of my app, my application runs fine but it gives out this global.asax error. The funny thing is that error is empty. The error are emailed to me and the email is empty. Nothing there.
There are several other apps running on the same server. My app has its own app pool and is configured correctly.
I know there is a couple answered questions on here regarding "request scoped" globals, but I want to nit-pick on something specifically and maybe squeeze some extra enlightenment out of one or two of you.I have an ASP.NET C# Website and a static Dictionary of objects (loaded from DB once on Application start). Each page request will need to do a lookup in the Dictionary (based on a key derived from the request url/etc) and get the appropriate object.The issue is I'm trying to maximize efficiency by reducing the lookups to the Dictionary per Request. Doing just a single lookup within a Page itself is easy enough and I can pass the object to sub controls, etc too.. but global.asax is separate from the Page and it also needs to use the object (in Application_BeginRequest and Session_Start).
So is doing a Dictionary lookup once in Application_BeginRequest, once (when necessary) in Session_Start and once in the Page negligible speed wise, even if there are many requests coming in every second?I would like it if I could just have a Request scoped global variable that I can easily call upon.. the only one I see available though is HttpContext.Current.Items and that is a Dictionary itself.Am I beingridiculously nit-picky with my concern over efficiency? or will these milliseconds (nanoseconds?) get me in the long run when more and more requests are being made?
PS. I currently only have around 100 objects in the Dictionary although this may increase in the future.
Whenever an unhandled exception occurs on our site, I want to:
Send a notification email Clear the user's session Send the user to a error page ("Sorry, a problem occurred...")
The first and last I've had working for a long time but the second is causing me some issues. My Global.asax.vb includes:
[Code]....
When I run a debug, I can see the session being cleared, but then on the next page the session is back again!
I eventually found a reference that suggests that changes to session will not be saved unless Server.ClearError is called. Unfortunately, if I add this (just below the line that sets "ex") then the CustomErrors redirect doesn't seem to kick in and I'm left with a blank page?
I have error handling in Application_Error event of globals.asax file. Inside this event, I'm using Response.Redirect(~errorview.aspx) method, for redirection to site which is able to handle errors in user friendly way.
Everything works fine, unless exception is rising in Application_Start event. When error occurs there, my application gets trapped in infinite loop with the Application_Error method hit repeatedly. What is more, the page I'm redirecting to never gets hit. Changing Response.Redirect(~errorview.aspx) method to Response.Redirect(~errorview.aspx, false) changes nothing.
The good news is, when Response.Redirect(~errorview.aspx) has been replaced with Server.Transfer(~errorview.aspx), errorview.aspx page succesfully gets hit.
The side effect now is not loading CSS, and errorview.aspx page looks ugly. What is more, the CSS is not loaded only when exception occurs in Application_Start event. Exceptions thrown from any other place don't make the CSS mess.
How I can handle this problem in correct way, and why the CSS is missing in the one particular situation ? What is the appropriate way of handling errors in my case ?
Is it possible in the global.asax file on session_start to check if a url string exists and it it does insert the string into a sql database? The url would be something link http://www.mysite.com?campaign=january.
I would want to capture the january bit and put that in the database for each visitor that uses that url.
I am trying to use the Application_Error to redirect the user to a custom error page. I know I could use the web.config to do this, but let's assume for now that this is not a desirable path to take.
Initially, I tried to do a Response.Redirect to perform this, however, there seem to be occasions where the current http context does not define the response object. So, I attempted to perform a check to make sure that the response object is not null prior to attempting the redirection, and if it is not defined, perform a Server.Transfer instead.
What happens is that in most cases, the Redirect causes the browser to some generic "friendlyish" error page rather than the requested error page.
So then I tried using Server.Transfer exclusively, and this worked well for most cases, however, sometimes the transfer didn't seem to take in the browser. Changing it back to a redirect in these cases solved that problem, but reintroduced the issue where the errors previously being captured and transferred now were being redirected.
What I surmised from this is that in certain contexts where the Application_Error method is trapped, it is necessary to use Server.Transfer in redirection, whereas in others, it is necessary to use Response.Redirect. The question then became twofold: (a) When is one necessary and when is the other? and (b) What available information can I poll to tell me when a given condition exists.
After much searching, I cannot find a reasonable answer to this question. So I began to trap errors and examine the HttpContext object for some indicator. One thing that I was looking for is the reason why if even with a defined Response in the current context does a redirect fail. The only thing that stood out is that even though a Response object may exist, the Session data could be absent. I added the case to check whether the Session data was null and perform a Transfer in this case and it seems to be handling it properly.
I emphasize "seems to be handling it properly" because no documentation I've been able to find confirms either the problem I am having or whether this is an appropriate strategy for solving it.
I guess the question is, am I on the right track here or is the null Session object just a red herring, indicative of nothing relevant. Here's the check I have set up for reference.