internal void Load(String json) { JsonConfigurationParser parser = new JsonConfigurationParser(); try { Data = parser.Parse(json); } catch (JsonReaderException e) { string errorLine = string.Empty; throw new FormatException($"json 配置文本格式错误:行号:{e.LineNumber}。", e); } }
private async Task LoadConfigurationDataAsync(ZookeeperClient client, bool firstLoad, string path) { try { var data = (await client.GetDataAsync(path)).ToArray(); if (firstLoad) { await client.SubscribeDataChange(path, this.OnNodeDataChangeAsync); } if (data != null) { LoadKey(); data = OpenSSL.RSADecrypt(data, _key); //data = OpenSSL.RSADecrypt(data, _key); string json = String.Empty; if (data.Length <= 3) { throw new Exception("配置中心返回了错误的配置数据"); } if (data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf) { json = new UTF8Encoding(false).GetString(data, 3, data.Length - 3); } else { json = Encoding.UTF8.GetString(data); } var parser = new JsonConfigurationParser(); //配置中心不能影响本地的用于构造配置节点路径的配置,否则将造成拉取错误配置。 this.Data = parser.Parse(json, ConfigurationPath.Combine("Schubert", "Group"), ConfigurationPath.Combine("Schubert", "AppSystemName"), ConfigurationPath.Combine("Schubert", "Version"), ConfigurationPath.Combine("Schubert", "Env"), ConfigurationPath.Combine("Schubert", "Configuration")); OnReload(); //Microsoft.Extensions.Configuration.FileConfigurationProvider的源码有这个代码OnReload() //OnReload会让GetReloadToken通知ChangeToken.OnChange去调用changeTokenConsumer的委托 //changeTokenConsumer的委托中如果走load等同逻辑的代码,机会再次调用OnReload,然后就挂 //ChangeToken.OnChange方案的用处是用来做外置事件源的处理,不能做内部事件调用 //Action reload = OnReload; //reload(); //不加OnReload,完全不起作用,但是为什么叫OnReload } } catch (TimeoutException ex) { string error = $"连接到配置中心(zk_server: {client.Options.ConnectionString })超时。"; HandleError(firstLoad, error, ex); } catch (FormatException ex) { string error = $"从配置中心加载配置发生错误,可能由于配置文件格式错误(zk_server: {client.Options.ConnectionString }, paht:{path})超时。"; HandleError(firstLoad, error, ex); } }