The subtlety is that in Application_Startup(), httpContext is indeed not null and httpContext.Request is really httpContext.get_Request().
And it is the act of calling get_Request() that throws the HttpException. On Fri, Mar 30, 2012 at 1:51 PM, Johnson, Thomas <thomas.john...@lpsvcs.com>wrote: > Sorry: if (httpContext != null && httpContext.Request != null)**** > > ** ** > > Since you’re in c# the second statement won’t be evaluated if the first is > false and you will avoid NRE**** > > ** ** > > *From:* Johnson, Thomas > *Sent:* Friday, March 30, 2012 2:50 PM > *To:* log4net-dev@logging.apache.org > *Subject:* RE: Proposed bug fix for > AspNetRequestPatternConverter.Convert()**** > > ** ** > > Typically you want to avoid code like this // maybe just do: if (httpContext > != null) { //the entirety of your method } else > writer.Write(SystemInfo.NotAvailableText);**** > > ** ** > > try**** > > {**** > > request = httpContext.Request;**** > > if (request == null)**** > > requestExists = false;**** > > }**** > > catch (System.Web.HttpException)**** > > {**** > > requestExists = false;**** > > }**** > > ** ** > > ** ** > > *From:* George Chung [mailto:geo...@glympse.com] > *Sent:* Friday, March 30, 2012 1:29 PM > *To:* log4net-dev@logging.apache.org > *Subject:* Proposed bug fix for AspNetRequestPatternConverter.Convert()*** > * > > ** ** > > Hello,**** > > I'm new to this mailing list. Sorry if this is not the appropriate way to > report a bug fix. Dereferencing HttpContext.Request will throw an exception > if you call it in an Asp.net application's Application_Start().**** > > ** ** > > Thus, if you have log4net logging *and* you use a pattern layout format > like %aspnet-request{REMOTE_ADDR} *and* you call Log4net inside > Application_Start(), Log4net will throw an exception trying to log the > message. The stack will look like this:**** > > ** ** > > log4net:ERROR [RollingFileAppender] ErrorCode: GenericFailure. Failed in > DoAppend**** > > System.Web.HttpException (0x80004005): Request is not available in this > context**** > > at System.Web.HttpContext.get_Request()**** > > at > log4net.Layout.Pattern.AspNetRequestPatternConverter.Convert(TextWriter > writer, LoggingEvent loggingEvent, HttpContext httpContext)**** > > at > log4net.Layout.Pattern.AspNetPatternLayoutConverter.Convert(TextWriter > writer, LoggingEvent loggingEvent)**** > > at log4net.Layout.Pattern.PatternLayoutConverter.Convert(TextWriter > writer, Object state)**** > > at log4net.Util.PatternConverter.Format(TextWriter writer, Object state) > **** > > at log4net.Layout.PatternLayout.Format(TextWriter writer, LoggingEvent > loggingEvent)**** > > at log4net.Layout.Layout2RawLayoutAdapter.Format(LoggingEvent > loggingEvent)**** > > ** ** > > ** ** > > Here is my proposed fix:**** > > ** ** > > ** ** > > internal sealed class AspNetRequestPatternConverter : > AspNetPatternLayoutConverter**** > > {**** > > /// <summary>**** > > /// Write the ASP.Net Cache item to the output**** > > /// </summary>**** > > /// <param name="writer"><see cref="TextWriter" /> that will receive > the formatted result.</param>**** > > /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on > which the pattern converter should be executed.</param>**** > > /// <param name="httpContext">The <see cref="HttpContext" /> under > which the ASP.Net request is running.</param>**** > > /// <remarks>**** > > /// <para>**** > > /// Writes out the value of a named property. The property name**** > > /// should be set in the <see > cref="log4net.Util.PatternConverter.Option"/>**** > > /// property.**** > > /// </para>**** > > /// </remarks>**** > > protected override void Convert(TextWriter writer, LoggingEvent > loggingEvent, HttpContext httpContext)**** > > {**** > > bool requestExists = true;**** > > **** > > HttpRequest request = null;**** > > try**** > > {**** > > request = httpContext.Request;**** > > if (request == null)**** > > requestExists = false;**** > > }**** > > catch (System.Web.HttpException)**** > > {**** > > requestExists = false;**** > > }**** > > **** > > if (requestExists)**** > > {**** > > if (Option != null)**** > > {**** > > WriteObject(writer, loggingEvent.Repository, > request.Params[Option]);**** > > }**** > > else**** > > {**** > > WriteObject(writer, loggingEvent.Repository, > request.Params);**** > > }**** > > }**** > > else**** > > {**** > > writer.Write(SystemInfo.NotAvailableText);**** > > }**** > > }**** > > }**** > > The information contained in this message is proprietary and/or > confidential. If you are not the intended recipient, please: (i) delete the > message and all copies; (ii) do not disclose, distribute or use the message > in any manner; and (iii) notify the sender immediately. In addition, please > be aware that any message addressed to our domain is subject to archiving > and review by persons other than the intended recipient. Thank you. >