开发者

Error in TraceContext

Here's the error

System.IndexOutOfRangeException.  
Index was outside the bounds of the array.  
at System.Collections.ArrayList.get_Item(Int32 index)  
at System.Collections.Specialized.NameObjectCollectionBase.NameObjectKeysEnumerator.get_Current()  
at System.Web.TraceContext.EndRequest()  
at System.Web.UI.Page.ProcessRequestEndTrace()  
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  
at System.Web.UI.Page.ProcessRequest()  
at System.Web.UI.Page.ProcessRequest(HttpContext context)  
at ASP.meebo_html.ProcessRequest(HttpContext context)  
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

We do have a custom trace listener. Here's the code.

using System;
using System.Diagnostics;
using System.Collections.Generic;

namespace Zinch.Debug
{
public class ZinchTraceListener : TraceListener
{
    public ZinchTraceListener()
    {

    }

    public static ZinchTraceEventCollection GetTraceList()
    {
        if (System.Web.HttpContext.Current == null)
            return new ZinchTraceEventCollection();

        ZinchTraceEventCollection list = (ZinchTraceEventCollection)System.Web.HttpContext.Current.Items["TraceCollection"];
        if (list == null)
        {
            list = new ZinchTraceEventCollection();
            System.Web.HttpContext.Current.Items.Add("TraceCollection", list);
        }
        return list;
    }

    public override void Write(string message)
    {
        ZinchTraceEventCollection trace = GetTraceList();
        trace.Add(message);
    }

    public override void WriteLine(string message)
    {
        Write(message);
    }
}

public class ZinchTraceEvent
{
    public ZinchTraceEvent()
    {
    }

    public ZinchTraceEvent(string message)
    {
        _message = message;
        _timestamp = DateTime.Now;
    }

    private DateTime _timestamp;
    public DateTime TimeStamp
    {
        get { return _timestamp; }
        set { _timestamp = value; }
    }

    private string _message;
    public string Message
    {
        get { return _message; }
        set { _message = value; }
    }

    private double _sincelast;
    public double SinceLast
    {
        get { return _sincelast; }
        set { _sincelast = value; }
    }

    private double _sincefirst;
    public double SinceFirst
    {
        get { return _sinc开发者_JAVA百科efirst; }
        set { _sincefirst = value; }
    }
}

public class ZinchTraceEventCollection : List<ZinchTraceEvent> 
{
    private object lockObject = new object();
    public void Add(string message)
    {
        ZinchTraceEvent item = new ZinchTraceEvent(message);
        if (this.Count > 0)
        {
            ZinchTraceEvent first = this[0];
            ZinchTraceEvent last = this[this.Count - 1];

            item.SinceFirst = (item.TimeStamp - first.TimeStamp).TotalMilliseconds;
            item.SinceLast = (item.TimeStamp - last.TimeStamp).TotalMilliseconds;
        }
        lock (lockObject)
        {
            Add(item);
        }
    }

    public override string ToString()
    {
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ZinchTraceEventCollection));
        using (System.IO.StringWriter writer = new System.IO.StringWriter())
        {
            lock (lockObject)
            {
                serializer.Serialize(writer, this);
            }
            return writer.ToString();
        }
    }
}

}

I can't think of anything else that might be causing the error, but I also don't see how this class would be causing it either. Any suggestions on where to look? I've never been able to reproduce it in a Dev environment, but it happens frequently enough in production that it can't be ignored either.


Should the index should be >1 (you have > 0)?

 if (this.Count > 1){

    ZinchTraceEvent first = this[0];
    ZinchTraceEvent last = this[this.Count - 1];
}

There is a chance it is a race condition.. but i bet its the above.

 ZinchTraceEventCollection list =     
    (ZinchTraceEventCollection)System.Web.HttpContext.Current.Items["TraceCollection"];
 if (list == null)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜