Ошибка в TraceContext - PullRequest
       21

Ошибка в TraceContext

0 голосов
/ 30 марта 2010

Вот ошибка

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)

У нас есть пользовательский слушатель трассировки. Вот код.

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 _sincefirst; }
        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();
        }
    }
}

}

Я не могу думать ни о чем другом, что могло бы вызвать ошибку, но я также не понимаю, как этот класс мог бы быть причиной этого. Любые предложения о том, где искать? Мне никогда не удавалось воспроизвести его в среде разработчиков, но в производстве это случается достаточно часто, и это тоже нельзя игнорировать.

1 Ответ

1 голос
/ 30 марта 2010

Должен ли индекс быть> 1 (у вас> 0)?

 if (this.Count > 1){

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

Есть шанс, что это состояние гонки ... но я держу пари, что выше.

 ZinchTraceEventCollection list =     
    (ZinchTraceEventCollection)System.Web.HttpContext.Current.Items["TraceCollection"];
 if (list == null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...