节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
1.59 KiB
Stardust
using NewLife.Log;
using NewLife.Net;
using NewLife.Remoting;
using NewLife.Serialization;

namespace StarAgent;

/// <summary>本机 UDP API 服务端</summary>
/// <remarks>
/// 本机端口同时提供本地命令行 RPC 与局域网广播搜索(Api/Info),是码神工具等外部工具依赖的既有契约。
/// NewLife.Agent 的 Web 面板启动时会把全局 <see cref="JsonHelper.Default"/> 的命名策略改成 camelCase,
/// 因此这里为服务端指定独立的 JsonHost,固定使用 PascalCase 字段名,避免全局策略漂移导致外部工具读取不到 LocalIP/FileVersion。
/// </remarks>
public static class LocalApiServer
{
    /// <summary>创建 JSON 编码器。使用独立的 JsonHost 并固定 PascalCase</summary>
    /// <returns></returns>
    public static JsonEncoder CreateEncoder()
    {
        var json = new FastJson();
        json.Options.PropertyNaming = PropertyNaming.None;

        return new JsonEncoder { JsonHost = json };
    }

    /// <summary>创建本机 API 服务端</summary>
    /// <param name="uri">监听地址</param>
    /// <param name="tracer">追踪器</param>
    /// <param name="log">日志</param>
    /// <returns></returns>
    public static ApiServer CreateServer(NetUri uri, ITracer? tracer = null, ILog? log = null)
    {
        var svr = new ApiServer(uri)
        {
            Encoder = CreateEncoder(),
            ReuseAddress = true,
        };
        if (tracer != null) svr.Tracer = tracer;
        if (log != null)
        {
            svr.Log = log;
            svr.EncoderLog = log;
        }

        return svr;
    }
}