[fix]修正NetSession中IExtend索引访问时可能报KeyNotFoundException异常的问题,主要是因为UdpSession中的Items在2020年使用并行字典,然后NetSession.Items跟它共用集合。该问题导致ApiServer处理Udp会话时,试图从NetSession中获取Encoder配置项报错,间接导致星尘代理StarAgent无法处理本机探索请求。12月之前的ApiServer使用自己的数据项集合没有该问题。 同时,为了避免并发问题,NetServer等扩展数据项统一使用并行字典,并在最终使用时再实例化避免浪费内容。
大石头 编写于 2023-12-10 00:24:18
X
using NewLife.Collections;
using NewLife.Data;

namespace NewLife.Model;

/// <summary>处理器上下文</summary>
public interface IHandlerContext //: IExtend
{
    /// <summary>管道</summary>
    IPipeline? Pipeline { get; set; }

    /// <summary>上下文拥有者</summary>
    Object? Owner { get; set; }

    /// <summary>读取管道过滤后最终处理消息</summary>
    /// <param name="message"></param>
    void FireRead(Object message);

    /// <summary>写入管道过滤后最终处理消息</summary>
    /// <param name="message"></param>
    Int32 FireWrite(Object message);
}

/// <summary>处理器上下文</summary>
public class HandlerContext : IHandlerContext, IExtend
{
    #region 属性
    /// <summary>管道</summary>
    public IPipeline? Pipeline { get; set; }

    /// <summary>上下文拥有者</summary>
    public Object? Owner { get; set; }

    /// <summary>数据项</summary>
    public IDictionary<String, Object?> Items { get; } = new NullableDictionary<String, Object?>();

    /// <summary>设置 或 获取 数据项</summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public Object? this[String key] { get => Items.TryGetValue(key, out var obj) ? obj : null; set => Items[key] = value; }
    #endregion

    #region 方法
    /// <summary>读取管道过滤后最终处理消息</summary>
    /// <param name="message"></param>
    public virtual void FireRead(Object message) { }

    /// <summary>写入管道过滤后最终处理消息</summary>
    /// <param name="message"></param>
    public virtual Int32 FireWrite(Object message) => 0;
    #endregion
}