alexmac05
asked on
How does Global.asax pick up exceptions from a C# web services method?
I have a simple class (you can see it below) but it is a web services method and it does a division by zero and throws an exception.
I have a Global.asax that should get the error message?
How does Global.asax know to catch the error message? it isn't working for me. I put a breakpoint in my method
INSIDE Global.asax
protected virtual void Application_Error(Object sender, EventArgs e)
{
BREAK POINT HERE but it never gets hit.
}
I have a Global.asax that should get the error message?
How does Global.asax know to catch the error message? it isn't working for me. I put a breakpoint in my method
INSIDE Global.asax
protected virtual void Application_Error(Object sender, EventArgs e)
{
BREAK POINT HERE but it never gets hit.
}
public class Birthday : System.Web.Services.WebService
{
[WebMethod]
public int divideByZERO(int pInt, int pIntZero)
{
try
{
return pInt / pIntZero;
}
catch (Exception ex)
{
//Console.WriteLine("EXCEPTION");
throw ex;
}
return 42;
}
}
Are you using the Global.asax for the service, or the Global.asax for the consumer of the service?
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
It is for the service.
also, changing the function by removing protected and void didn't work.
Thanks,
alex
also, changing the function by removing protected and void didn't work.
Thanks,
alex
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I am a newbie to this. I'm used to coding but not .net web apps.
I haven't tried any other events.
What should I be googling to read about this? Just Global.asax events?
I have uploaded a picture of where it is located in the project
I haven't tried any other events.
What should I be googling to read about this? Just Global.asax events?
I have uploaded a picture of where it is located in the project
namespace BirthDayWS
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
}
protected void Application_End(object sender, EventArgs e)
{
}
void Application_Error(Object sender, EventArgs e)
{
string errMsg, userText, pageData, versionInfo, eSource = "", eDetails = "", eStack = "";
Exception outerE = null, innerE = null, testE;
AssemblyName currentAss;
try
{
outerE = Server.GetLastError();
HttpException httpException = outerE as HttpException;
if (httpException != null)
{
if (httpException.GetHttpCode() == 500)
{
}
Exception innerException = httpException.InnerException;
if (innerException != null)
{
if (innerException.Message == "Maximum request length exceeded.")
return;
}
}
}
catch (Exception ie)
{
eSource = "<b>BABY JESUS</b>" + ie.Message + "</b>";
}
try
{
currentAss = Assembly.GetExecutingAssembly().GetName();
versionInfo = "<b>Version Information:</b> " + currentAss.Name + " Version: " + currentAss.Version.ToString();
}
catch (Exception ie)
{
versionInfo = ie.Message + " Hello alex";
}
}
}
}
LocationOfGlobalASAXFile.bmp
put a breakpoint on the 1st brace "{" in the Application_Error function.
then get rid of the try/catch in the WebMethod... it may be that the exception was 'caught' then re-thrown thats bypassing the global handler.
then get rid of the try/catch in the WebMethod... it may be that the exception was 'caught' then re-thrown thats bypassing the global handler.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
THe namespace was created by default when I created the file. It has to be there, it is the namespace of the application.
Console.WriteLine("Applica tion_Start was hit"); that I will see these lines if the callbacks are fired?
Console.WriteLine("Applica
protected void Application_Start(object sender, EventArgs e)
{
Console.WriteLine("Application_Start was hit");
}
protected void Application_End(object sender, EventArgs e)
{
Console.WriteLine("Application_Start was hit");
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
There are two files associated with this file.
1. Global.asax
2. Global.asax.cs
My question now is where should I write to a file? Global.asax.cs?
Also, I wonder if the Global.asax needs more code in it? I only see one line in it:
<%@ Application Codebehind="Global.asax.cs " Inherits="BirthDayWS.Globa l" Language="C#" %>
but in searching the net some files seem to look like the attached bit map
IsThisWhatMineShouldLookLIke.jpg
1. Global.asax
2. Global.asax.cs
My question now is where should I write to a file? Global.asax.cs?
Also, I wonder if the Global.asax needs more code in it? I only see one line in it:
<%@ Application Codebehind="Global.asax.cs
but in searching the net some files seem to look like the attached bit map
IsThisWhatMineShouldLookLIke.jpg
ASKER
Thanks a lot for your help.
ASKER
Problem: How do you get callbacks to fire in the Global.aspx.cs code behind file in VS2005 if theyre not firing automatically?
Answer:
So, as we know, the Global.aspx file is two files
1. Global.aspx the script
2. Global.aspx.cs the code behind file
Using Visual Studio 2005, one must manually create this file.
Then one must go to the script part and add the callbacks manually.
<%@ Application Codebehind="Global.asax.cs " Inherits="BirthDayWS.Globa l" Language="C#" %>
<script RunAt="server">
void Application_Start(Object sender, EventArgs e)
{
//Code that runs on applicaton startup
}
void Application_End(Object sender, EventArgs e)
{
}
void Application_Error(Object sender, EventArgs e)
{
}
void Session_End(Object sender, EventArgs e)
{
}
</script>
If the Global.aspx file has these callbacks just as I have listed them here (BLANK) then this causes the callbacks to fire such that inside the Global.asax.cs file you can code whatever you want or set breakpoints.
Yeah.
Cheers,
Alex
Answer:
So, as we know, the Global.aspx file is two files
1. Global.aspx the script
2. Global.aspx.cs the code behind file
Using Visual Studio 2005, one must manually create this file.
Then one must go to the script part and add the callbacks manually.
<%@ Application Codebehind="Global.asax.cs
<script RunAt="server">
void Application_Start(Object sender, EventArgs e)
{
//Code that runs on applicaton startup
}
void Application_End(Object sender, EventArgs e)
{
}
void Application_Error(Object sender, EventArgs e)
{
}
void Session_End(Object sender, EventArgs e)
{
}
</script>
If the Global.aspx file has these callbacks just as I have listed them here (BLANK) then this causes the callbacks to fire such that inside the Global.asax.cs file you can code whatever you want or set breakpoints.
Yeah.
Cheers,
Alex
The Application_OnError in the Global.asax works for ASP.NET but does not work for web services. The reason for this is that the HTTP handler for XML Web services consumes any exception that occurs while an XML Web service is executing and turns it into a SOAP fault prior to the Application_Error event is called.
To create global exception handling for your web services you have to build a SOAP extension. The SOAP extension can check for the existence of an exception in the ProcessMessage method and will handle the global error handling in a similar way that the ASP.NET Application_OnError does.
Obviously
To create global exception handling for your web services you have to build a SOAP extension. The SOAP extension can check for the existence of an exception in the ProcessMessage method and will handle the global error handling in a similar way that the ASP.NET Application_OnError does.
Obviously
public class SoapExceptionHandler : System.Web.Services.Protocols.SoapExtension
{
public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterSerialize)
{
if (message.Exception != null)
{
//log your error here
}
}
}
public override object GetInitializer(Type serviceType)
{
return null;
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(object initializer)
{
}
}