[ 
https://issues.apache.org/jira/browse/LOG4NET-80?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Stefan Bodewig updated LOG4NET-80:
----------------------------------

         Due Date: 13/Jul/05  (was: 13/Jul/05)
    Fix Version/s: 1.2 Maintenance Release

> Allow LogitcalThreadContextProperties to be stored in HttpContext.Items 
> instead of CallContext
> ----------------------------------------------------------------------------------------------
>
>                 Key: LOG4NET-80
>                 URL: https://issues.apache.org/jira/browse/LOG4NET-80
>             Project: Log4net
>          Issue Type: Improvement
>          Components: Other
>    Affects Versions: 1.2.10
>            Reporter: Ron Grabowski
>            Priority: Minor
>             Fix For: 1.2 Maintenance Release
>
>         Attachments: httpContextPatch.patch
>
>
> According to these posts:
>  http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.html
>  http://forum.springframework.net/showthread.php?t=572
> and this thread on the mailing list:
>  http://www.mail-archive.com/[email protected]/msg01236.html
> it might be a good idea to investigate storing LogicalThreadContext values 
> inside the HttpContext.Items if log4net is being used within an ASP.Net 
> application. Other projects such as IBatisNet, Spring.Net, Castle Project's 
> Active Record, etc. do this. In a nutshell, IIS may change the thread on 
> which a request is processed on durings the request's lifetime. Accoring to 
> the post on springframework.net, a worse case scenerio is for each ASP.Net 
> page lifecycle event to be switched to a different thread. Even though 
> HttpContext uses CallContext internally its supposedly does other things to 
> make it a safer place for storing per-request values.
> I haven't studied the other projects implementations in depth but the basic 
> idea is to replace this code in LogicalThreadContextProperties:
>  PropertiesDictionary properties = 
> (PropertiesDictionary)CallContext.GetData(SLOT_NAME);
> with this:
>  PropertiesDictionary properties = 
> (PropertiesDictionary)contextAccessor.GetData();
> where contextAccessor is CallContextAccessor:IContextAccess, 
> HttpContextAccessor:IContextAccessor, etc.:
>  internal LogicalThreadContextProperties(IContextAccessor contextAccessor)
>  {
>   this.contextAccessor = contextAccessor;
>  }
> The decision on which IContextAccessor to use could come from a factory:
>  public class DefaultContextAccessorFactory : IContextAccessorFactory
>  {
>   private const string SLOT_NAME = 
> "log4net.Util.LogicalThreadContextProperties";
>  
>   public IContextAccessor CreateContextAccessor()
>   {
>    // another implementation might _always_ use CallContext instead
>    // of first testing for HttpContext
>    if (HttpContext.Current != null)
>    {
>     return new HttpContextAccessor(SLOT_NAME);
>    }
>    else
>    {
>     return new CallContextAccessor(SLOT_NAME);
>    }
>   } 
>  }
> I haven't figured out a good way for LogicalThreadContext to know which 
> factory to be initialized with. This was my first attempt:
>  static LogicalThreadContext()
>  {
>   // we should retrieve the IContextAccessorFactory from the configuration 
> system...
>   IContextAccessorFactory contextFactory = new 
> DefaultContextAccessorFactory();
>                       
>   s_properties = new 
> LogicalThreadContextProperties(contextFactory.CreateContextAccessor());
>   s_stacks = new ThreadContextStacks(s_properties);
>  }
> The problem is that IContextAccessorFactory should be coming from the 
> configuration system some how. Contexts don't know about ILoggerRepository 
> and vice versa. Maybe its acceptable for LogicalThreadContext's static 
> constructor to always use the DefaultContextAccessorFactory when its 
> initialized and the user can specify another factory via a setter. 
> Has anyone actually run into a problem with requests being switched to 
> different threads? I mostly understand the reasoning for it but I can't 
> imagine it being a regular occurance.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to