{

  /* asp.net core 原始web服务配置 */
  "server": {
    "urls": [ "http://localhost:4513" ]
  },


  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",


  "Sers": {
    /* 通讯层配置 */
    "CL": {
      /* 共用配置，子项共用，覆写子项未指定的配置 */
      "Config": {

        "workThread": {
          // 模式，可为 LongThread（默认）、LongThread_TimeLimit、ManagedThread、ConsumerCascade
          "mode": "LongThread",
          /* 后台处理消息的线程个数（单位个,默认2） */
          "threadCount": 2,
          /* 最大线程数（包含常驻线程和临时线程），默认100。仅当mode为ManagedThread时有效 */
          "maxThreadCount": 100,
          /* 等待队列的最大长度（默认：100000）。仅当mode为LongThread_TimeLimit和ManagedThread时有效 */
          "pendingQueueLength": 100000,
          /* 超时时间（单位ms，默认300000），仅当mode为LongThread_TimeLimit、ManagedThread时有效 */
          "timeoutMs": 300000
        },

        /* 请求超时时间（单位ms，默认300000） */
        "requestTimeoutMs": 300000,


        /* 连接秘钥，用以验证连接安全性。服务端和客户端必须一致 */
        "secretKey": "SersCL"

      },
      /* one conn is one channel.can be multiable */
      "Client": [
        {
          // Socket.Iocp
          /* (x.1) type - Iocp */
          /* the class of builder in assemblyFile  */
          "className": "Sers.CL.Socket.Iocp.OrganizeClientBuilder",

          /* 通信模式（默认值：Simple）。可为 Simple、Timer、ThreadWait  */
          //"mode": "ThreadWait",

          /* (x.2) conn config */
          /* 服务端 host地址。例如： "127.0.0.1"、"sers.cloud" */
          "host": "127.0.0.1",
          /* 服务端 监听端口号。例如： 4501 */
          "port": 4501

        }
      ]
    },


    // RpcData序列化模式。可不指定。默认为Text。
    // 可为 Newtonsoft、Text、BytePointor。
    // 效率依次递增。BytePointor 序列化为二进制数据而不是json字符串。
    "RpcDataSerializeMode": "Text",


    /* LocalApiService 配置,可不指定 */
    "LocalApiService": {

      "workThread": {
        // 模式，可为 LongThread（默认）、LongThread_TimeLimit、ManagedThread、ConsumerCascade
        "mode": "LongThread",
        /* 后台服务的线程个数（单位个,默认16）(0代表不开启服务) */
        "threadCount": 16,
        /* 最大线程数（包含常驻线程和临时线程），默认100。仅当mode为ManagedThread时有效 */
        "maxThreadCount": 100,
        /* 等待队列的最大长度（默认：100000）。仅当mode为LongThread_TimeLimit和ManagedThread时有效 */
        "pendingQueueLength": 100000,
        /* 超时时间（单位ms，默认300000），仅当mode为LongThread_TimeLimit、ManagedThread时有效 */
        "timeoutMs": 300000
      },


      /* 静态文件映射器。映射站点静态文件，可多个,可不指定 */
      "//staticFiles": [
        {
          /* api路由前缀，例如 "/demo/ui/*" */
          "route": "/demo/ui/*",
          /* api描述，静态文件描述 */
          "apiName": "demo站点静态文件",


          /* 静态文件路径。可为相对路径或绝对路径。若为空或空字符串则默认为入口程序所在目录。demo:"wwwroot/demo" */
          "rootPath": "wwwroot/demo",

          /* 静态文件类型映射配置的文件路径。可为相对路径或绝对路径。例如"contentTypeMap.json"。若不指定（或指定的文件不存在）则不指定文件类型映射配置 */
          "contentTypeMapFile": "contentTypeMap.json",

          /* 回应静态文件时额外添加的http回应头。可不指定。 */
          "responseHeaders": {

            //设置浏览器静态文件缓存3600秒
            "Cache-Control": "public,max-age=3600"
          }
        }
      ],


      /* 默认站点名称，可多个,可不指定 */
      "//apiStationNames": [ "demo" ],

      /* Api加载器配置 */
      "//ApiLoaders": [
        {
          /* 在此Assembly中查找api加载器(如 Sers.Core.dll 、Sers.NetcoreLoader.dll 、 Sers.Serslot.dll ) */
          //"loader_assemblyFile": "Sers.Core.dll",
          /* 加载器的类名，可为 Sers.SersLoader.ApiLoader 、 Sers.NetcoreLoader.ApiLoader、 Sers.Serslot.ApiLoader 等。若不指定则默认为"Sers.SersLoader.ApiLoader" */
          //"loader_className": "Sers.SersLoader.ApiLoader",


          //（通过反射从此包中获取要加载的api）
          /* 在此Assembly中查找服务(如 Did.SersLoader.Demo.dll)(assembly、assemblyFile、assemblyName 指定任一即可) */
          "assemblyFile": "Did.SersLoader.Demo.dll",

          /* 在此Assembly中查找服务(如 Did.SersLoader.Demo)(assembly、assemblyFile、assemblyName 指定任一即可) */
          //"assemblyName": "Did.SersLoader.Demo",


          /* 强制指定ApiStation名称。可不指定。（优先级从高到低：  apiStationName_Force 、 在代码上的SsStationNameAttribute特性指定 、 apiStationName 、 appsettings.json指定） */
          //"apiStationName_Force": "",

          /* ApiStation名称。可不指定。（优先级从高到低：  apiStationName_Force 、 在代码上的SsStationNameAttribute特性指定 、 apiStationName 、 appsettings.json指定） */
          "apiStationName": "demo"


          /* 强制路由前缀,例如："demo/v1"。可不指定。（优先级从高到低：  routePrefix_Force、在代码上的SsRoutePrefixAttribute特性指定 、 routePrefix） */
          //"routePrefix_Force": "",

          /* 路由前缀,例如："demo/v1"。可不指定。（优先级从高到低：  routePrefix_Force、在代码上的SsRoutePrefixAttribute特性指定 、 routePrefix ） */
          //"routePrefix": ""
        }
      ],


      /* 调用Api时的自定义Scope对象。可不指定。事件顺序为  OnCreateScope -> BeforeCallApi -> OnDispose */
      "//OnCreateScope": [
        {
          //ApiTrace publisher(推送ApiTrace数据到ApiTrace.Collector)

          /* 在此Assembly中加载类 */
          "assemblyFile": "Sers.Core.dll",
          /* 动态加载的类名，必须继承接口 Sers.Core.Module.Api.ApiEvent.ApiScope.IApiScopeEvent */
          "className": "Sers.Core.Module.Api.LocalApi.ApiTrace.ApiTracePublisher",

          /* 搜集器名称（根据此名称推送到对应的搜集器,搜集器在ApiTrace.Collector中配置）,若不指定则不加载 */
          "collectorName": "default"
        }
      ],

      /* 调用api前的事件，可不指定。事件顺序为  OnCreateScope -> BeforeCallApi -> OnDispose */
      "//BeforeCallApi": [
        {
          /* 在此Assembly中加载类 */
          //"assemblyFile": "Sers.Core.dll",
          /* 动态加载的类名，必须继承接口 Sers.Core.Module.Api.ApiEvent.BeforeCallApi.IBeforeCallApi */
          "className": "Bearer",
          //Bearer: 在调用接口前，会获取 rpcData.http.headers.Authorization(格式为 "Bearer xxxxxx")，并作为参数调用接口api_verifyAt，把返回数据放到 rpcData.user.userInfo

          /* 验证at接口的地址 */
          "api_verifyAt": "/AuthCenter/account/verifyAt",
          /* 验证at接口的httpMethod。(如 GET POST 可不指定) */
          "api_httpMethod": "POST"
        },

        {
          //AccountInCookie 在调用接口前，会获取 rpcData.http.headers.Cookie(格式为 "user=xxx;c=7")中的user，在账号列表中比对userToken，回写 CallerSource(rpcData.caller.source) 和 userInfo(rpcData.user.userInfo)
          "className": "AccountInCookie",
          "account": [
            {
              "userToken": "admin_123456",
              //"CallerSource": "Internal",
              "userInfo": {
                "name": "超级管理员",
                "入口": "Gover网关"
              }
            }
          ]
        }
      ]
    },


    /* ServiceStation配置,可不指定 */
    "ServiceStation": {

      /* 自动上报cpu Usage。不指定则不上报 */
      "//UsageReporter": {
        /* 上报时间间隔（单位：秒） */
        "intervalSecond": 2
      },


      /* 服务中心注册配置。在向服务中心注册站点前 是否打印（Logger.Info）请求参数。默认:false */
      "StationRegist_PrintRegistArg": false,


      /* serviceStation站点信息 */
      "serviceStationInfo": {
        "serviceStationName": "SerslotDemo",

        /* 服务站点版本信息,若不指定则为入口链接库的版本号 */
        "//stationVersion": "1.1.9.0",

        /* [json]服务站点额外信息,可不指定 */
        "info": null
      }
    },




    /* ApiTrace 搜集器配置,可不指定 */
    "ApiTrace": {
      "Collector": [
        { //搜集ApiTrace到 Log/{yyyy-MM}/[{yyyy-MM-dd}]ApiTrace.txt文件

          /* 搜集器名称（ApiTrace推送端根据此名称推送到对应的搜集器）,若不指定则不加载 */
          "collectorName": "default",

          /* 在此Assembly中加载类 */
          "assemblyFile": "Sers.Core.dll",
          /* 动态加载的类名，必须继承接口 Sers.Core.Module.ApiTrace.Collector.IApiTraceCollector */
          //"className": "Sers.Core.Module.ApiTrace.Collector.TxtCollector", //亦可为TxtCollector


          "tags": {
            // 可为 requestRpc requestData responseRpc responseData
            "route": "{{requestRpc.route}}",
            //"{{requestRpc.route}}": "route",

            "url": "{{requestRpc.http.url}}",
            "method": "{{requestRpc.http.method}}",
            "requestRpc": "{{requestRpc}}",
            "requestData": "{{requestData}}",

            "responseRpc": "{{responseRpc}}",
            "responseState": "{{responseRpc.http.headers.responseState}}",
            //"responseError_Base64": "{{responseRpc.http.headers.responseError_Base64}}"

            "responseData": "{{responseData}}",
            "responseData.error": "{{responseData.error}}"
          }
        },
        { //搜集ApiTrace到 splunk

          /* 搜集器名称（ApiTrace推送端根据此名称推送到对应的搜集器）,若不指定则不加载 */
          "collectorName": "default",

          /* 在此Assembly中加载类 */
          "assemblyFile": "Sers.Core.dll",
          /* 动态加载的类名，必须继承接口 Sers.Core.Module.ApiTrace.Collector.IApiTraceCollector */
          //"className": "Sers.Core.Module.ApiTrace.Collector.SplunkCollector",


          "server": {
            "url": "http://192.168.20.20:8088/services/collector",
            "authToken": "xxxxx",
            "index": "dev",
            //若指定则在指定时间间隔统一推送数据，若不指定则立即推送。单位:ms
            "//intervalMs": 2000
          },

          "//hostInfo": {
            "host": "192.168.20.20:8088",
            "source": "http:sers",
            "sourcetype": "sers-ApiTrace"
          },

          //custome object
          "//appInfo": {
            "namespace": "sers.cloud",
            "appName": "mc",
            "moduleName": "demo"
            //,"...": {}
          },

          "tags": {
            // 可为 requestRpc requestData responseRpc responseData
            "route": "{{requestRpc.route}}",
            //"{{requestRpc.route}}": "route",

            "url": "{{requestRpc.http.url}}",
            "method": "{{requestRpc.http.method}}",
            "requestRpc": "{{requestRpc}}",
            "requestData": "{{requestData}}",

            "responseRpc": "{{responseRpc}}",
            "responseState": "{{responseRpc.http.headers.responseState}}",
            //"responseError_Base64": "{{responseRpc.http.headers.responseError_Base64}}"

            "responseData": "{{responseData}}",
            "responseData.error": "{{responseData.error}}"
          }
        },
        { //搜集ApiTrace到 ElasticSearch

          /* 搜集器名称（ApiTrace推送端根据此名称推送到对应的搜集器）,若不指定则不加载 */
          "collectorName": "default",

          /* 在此Assembly中加载类 */
          "assemblyFile": "Sers.Core.dll",
          /* 动态加载的类名，必须继承接口 Sers.Core.Module.ApiTrace.Collector.IApiTraceCollector */
          //"className": "Sers.Core.Module.ApiTrace.Collector.ElasticSearchCollector",


          "server": {
            // es address, example:"http://192.168.20.20:9200"
            "url": "http://192.168.20.20:9200",
            //es index, example:"dev"
            "index": "dev_apitrace",
            //es type, example:"_doc"
            //"type": "_doc",
            //若指定则在指定时间间隔统一推送数据，若不指定则立即推送。单位:ms
            "//intervalMs": 2000
          },

          //custome object
          "//appInfo": {
            "namespace": "sers.cloud",
            "appName": "mc",
            "moduleName": "demo"
            //,"...": {}
          },

          "//tags": {
            // 可为 requestRpc requestData responseRpc responseData
            "route": "{{requestRpc.route}}",
            //"{{requestRpc.route}}": "route",

            "url": "{{requestRpc.http.url}}",
            "method": "{{requestRpc.http.method}}",
            "requestRpc": "{{requestRpc}}",
            "requestData": "{{requestData}}",

            "responseRpc": "{{responseRpc}}",
            "responseState": "{{responseRpc.http.headers.responseState}}",
            //"responseError_Base64": "{{responseRpc.http.headers.responseError_Base64}}"

            "responseData": "{{responseData}}",
            "responseData.error": "{{responseData.error}}"
          }
        }
      ]
    }
  },

  /* Vit工具配置，可不指定 */
  "Vit": {

    /* 日志配置,可不指定 */
    "Logger": {
      /* print the log to Log/*.txt default:true  */
      "PrintToTxt": true,
      /* print the log to console. default:true  */
      "PrintToConsole": true,

      /* [optional]collector to send log to */
      "Collector": [
        {
          /* 在此Assembly中加载类 */
          "assemblyFile": "Vit.Core.dll",
          /* 动态加载的类名，必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
          //"className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",

          "server": {
            "url": "https://192.168.20.20:8088/services/collector",
            "authToken": "xxxxx",
            "index": "dev",
            //若指定则在指定时间间隔统一推送数据，若不指定则立即推送。单位:ms
            "//intervalMs": 2000
          },

          "//hostInfo": {
            "host": "192.168.20.20:8088",
            "source": "http:mc",
            "sourcetype": "httpevent"
          },

          //custome object
          "//appInfo": {
            "namespace": "sers.cloud",
            "appName": "mc",
            "moduleName": "demo"
            //,"...": {}
          }
        },
        {
          /* 在此Assembly中加载类 */
          "assemblyFile": "Vit.Core.dll",
          /* 动态加载的类名，必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
          //"className": "Vit.Core.Module.Log.LogCollector.ElasticSearch.ElasticSearchCollector",

          "server": {
            // es address, example:"http://192.168.20.20:9200"
            "url": "http://192.168.20.20:9200",
            //es index, example:"dev"
            "index": "dev_log",
            //es type, example:"_doc"
            //"type": "_doc",
            //若指定则在指定时间间隔统一推送数据，若不指定则立即推送。单位:ms
            "//intervalMs": 2000
          },

          //custome object
          "appInfo": {
            "namespace": "sers.cloud",
            "appName": "mc",
            "moduleName": "demo"
            //,"...": {}
          }
        }
      ]
    },

    /* 序列化配置，可不指定 */
    "Serialization": {
      /* 序列化字符编码。可不指定，默认 UTF8。只可为 UTF7,UTF8,UTF32,ASCII,Unicode。 */
      "Encoding": "UTF8",

      /* 时间序列化格式。可不指定，默认 "yyyy-MM-dd HH:mm:ss" */
      "DateTimeFormat": "yyyy-MM-dd HH:mm:ss"
    }
  },


  "serslot": {

    /* 额外api。SsApiDesc格式。除了系统api外，可以指定额外api。若指定返回数据（reply）,则直接返回数据；若不指定返回数据，则由host进行处理 */
    "//extApi": [
      { //为 SsApiDesc格式
        "description": "首页",
        //路由(可为泛接口,如 "/a/*" )
        "route": "/index.html",
        //扩展配置（json）
        "extendConfig": {
          //请求方式，若不指定则默认支持所有方式（demo: POST、GET、DELETE、PUT等）
          "httpMethod": "GET",

          //返回数据（可为数值、字符串、对象、数组）。若不指定，则由host进行处理
          "reply": { "hello": "sers" },

          //系统生成的接口文字描述
          "sysDesc": "method:GET"
        }
      },
      {
        //路由(可为泛接口,如 "/a/*" )
        "route": "/*"
      }

    ]


  }
}
