/// <summary>
        /// 实例化RemoteProxy
        /// </summary>
        /// <param name="node"></param>
        /// <param name="logger"></param>
        public RemoteProxy(ServerNode node, ILog logger)
        {
            this.node = node;
            this.logger = logger;

            InitRequest();
        }
        public TracExplorerControl()
        {
            InitializeComponent();

            // Set handlers
            doubleClickHandlers.Add(typeof(WikiPageNode), WikiPageDoubleClick);
            doubleClickHandlers.Add(typeof(TicketNode), TicketDoubleClick);

            CommonRoot servers = CommonRoot.Instance;

            treeTrac.BeginUpdate();

            foreach (ServerDetails server in servers.Servers)
            {
                ServerNode nodeServer = new ServerNode(server);
                treeTrac.Nodes["nodeServers"].Nodes.Add(nodeServer);
            }

            treeTrac.Nodes["nodeServers"].Expand();

            treeTrac.EndUpdate();

            // captions
            btnDelTracServer.Text = btnDelTracServer.ToolTipText = btnServerDelete.Text = Properties.Resources.MenuDelete;
            btnNewTracServer.Text = btnNewTracServer.ToolTipText = btnNewServer.Text = Properties.Resources.MenuNewServer;
            btnServerRefresh.Text = btnServerRefresh.ToolTipText = Properties.Resources.MenuRefresh;
        }
        public ServerListWindow(MainWindow parent)
            : base(Gtk.WindowType.Toplevel)
        {
            TransientFor = parent;

            this.Build();
            this.connectButton.TooltipMarkup = Catalog.GetString("Connects to the selected server");
            this.addServerButton.TooltipMarkup = Catalog.GetString("Adds new server entry to the list");
            this.removeServerButton.TooltipMarkup = Catalog.GetString("Removes the selected entry from the list");

            serverStore = new Gtk.NodeStore(typeof(ServerNode));
            serverNodes = new List<ServerNode>();

            List<string> addresses = Config.Instance.GetStringList("ServerList.Addresses");
            List<int> ports = Config.Instance.GetIntegerList("ServerList.Ports");
            int count = Math.Min(addresses.Count, ports.Count);
            for(int i = 0; i < count; i++)
            {
                ServerNode node = new ServerNode(addresses[i], ports[i]);
                serverStore.AddNode(node);
                serverNodes.Add(node);
            }

            serverList.NodeStore = serverStore;

            Gtk.CellRendererText addressRenderer = new Gtk.CellRendererText();
            addressRenderer.Editable = true;
            addressRenderer.Edited += OnAddressEdited;
            Gtk.CellRendererText portRenderer = new Gtk.CellRendererText();
            portRenderer.Editable = true;
            portRenderer.Edited += OnPortEdited;
            serverList.AppendColumn(Catalog.GetString("Address"), addressRenderer, "text", 0);
            serverList.AppendColumn(Catalog.GetString("Port"), portRenderer, "text", 1);

            serverList.ShowExpanders = false;

            serverList.NodeSelection.Changed += OnServerSelectionChanged;
        }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/certificates";

                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Post
                };

                request.Content = new BlittableJsonContent(stream =>
                {
                    using (var writer = new BlittableJsonTextWriter(ctx, stream))
                    {
                        writer.WriteStartObject();

                        writer.WritePropertyName(nameof(CertificateDefinition.Name));
                        writer.WriteString(_name.ToString());
                        writer.WriteComma();
                        writer.WritePropertyName(nameof(SecurityClearance));
                        writer.WriteString(_clearance.ToString());
                        writer.WriteComma();

                        if (_password != null)
                        {
                            writer.WritePropertyName(nameof(CertificateDefinition.Password));
                            writer.WriteString(_password.ToString());
                            writer.WriteComma();
                        }

                        writer.WritePropertyName(nameof(CertificateDefinition.Permissions));
                        writer.WriteStartObject();
                        bool first = true;
                        foreach (var kvp in _permissions)
                        {
                            if (first == false)
                            {
                                writer.WriteComma();
                            }
                            first = false;

                            writer.WriteString(kvp.Key);
                            writer.WriteComma();
                            writer.WriteString(kvp.Value == DatabaseAccess.ReadWrite ? nameof(DatabaseAccess.ReadWrite) : nameof(DatabaseAccess.Admin));
                        }
                        writer.WriteEndObject();

                        writer.WriteEndObject();
                    }
                });

                return(request);
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/indexes/terms?name={Uri.EscapeDataString(_indexName)}&field={Uri.EscapeDataString(_field)}&fromValue={_fromValue}&pageSize={_pageSize}";

                return new HttpRequestMessage
                {
                    Method = HttpMethod.Get
                };
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                var pathBuilder = new StringBuilder(node.Url);
                pathBuilder.Append("/databases/")
                    .Append(node.Database)
                    .Append("/counters?")
                    .Append("docId=")
                    .Append(Uri.EscapeDataString(_docId));

                if (_returnFullResults)
                    pathBuilder.Append("&full=").Append(true);

                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Get
                };

                if (_counters.Length > 0)
                {
                    if (_counters.Length > 1)
                    {
                        PrepareRequestWithMultipleCounters(pathBuilder, request, ctx);
                    }
                    else
                    {
                        pathBuilder.Append("&counter=").Append(Uri.EscapeDataString(_counters[0]));
                    }
                }

                url = pathBuilder.ToString();

                return request;
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                var pathBuilder = new StringBuilder(node.Url);

                pathBuilder.Append("/databases/")
                .Append(node.Database)
                .Append("/timeseries")
                .Append("?docId=")
                .Append(Uri.EscapeDataString(_docId));

                if (_start > 0)
                {
                    pathBuilder.Append("&start=")
                    .Append(_start);
                }

                if (_pageSize < int.MaxValue)
                {
                    pathBuilder.Append("&pageSize=")
                    .Append(_pageSize);
                }

                pathBuilder.Append("&name=")
                .Append(Uri.EscapeDataString(_name));

                if (_from.HasValue)
                {
                    pathBuilder.Append("&from=")
                    .Append(_from.Value.EnsureUtc().GetDefaultRavenFormat());
                }

                if (_to.HasValue)
                {
                    pathBuilder.Append("&to=")
                    .Append(_to.Value.EnsureUtc().GetDefaultRavenFormat());
                }

                if (_includes != null)
                {
                    AddIncludesToRequest(pathBuilder, _includes);
                }

                if (_returnFullResults)
                {
                    pathBuilder.Append("&full=").Append(true);
                }

                url = pathBuilder.ToString();

                var request = new HttpRequestMessage {
                    Method = HttpMethod.Get
                };

                return(request);
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/admin/tasks/state?key={_taskId}&type={_type}&disable={_disable}";

                if (_taskName != null)
                {
                    url += $"&taskName={Uri.EscapeDataString(_taskName)}";
                }

                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Post
                };

                return(request);
            }
Exemple #9
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/logs/configuration";

                return(new HttpRequestMessage(HttpMethod.Post, url)
                {
                    Content = new BlittableJsonContent(async stream => await ctx.WriteAsync(stream, DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(_parameters, ctx)).ConfigureAwait(false))
                });
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/admin/periodic-backup";

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Post,
                    Content = new BlittableJsonContent(stream =>
                    {
                        var config = EntityToBlittable.ConvertCommandToBlittable(_configuration, ctx);
                        ctx.Write(stream, config);
                    })
                };

                return(request);
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/indexes/set-priority";

                return(new HttpRequestMessage
                {
                    Method = HttpMethod.Post,
                    Content = new BlittableJsonContent(stream =>
                    {
                        ctx.Write(stream, _parameters);
                    })
                });
            }
Exemple #12
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/bulk_insert?id={_id}";
                var message = new HttpRequestMessage
                {
                    Method  = HttpMethod.Post,
                    Content = _stream,
                    Headers =
                    {
                        TransferEncodingChunked = true
                    }
                };

                return(message);
            }
Exemple #13
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/timeseries/stats?docId={Uri.EscapeDataString(_documentId)}";

                return(new HttpRequestMessage
                {
                    Method = HttpMethod.Get
                });
            }
Exemple #14
0
                public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
                {
                    url = $"{node.Url}/databases/{node.Database}{_url}";

                    var request = new HttpRequestMessage
                    {
                        Method  = _method,
                        Content = new BlittableJsonContent(stream =>
                        {
                            if (_payload != null)
                            {
                                ctx.Write(stream, _payload);
                            }
                        })
                    };

                    return(request);
                }
Exemple #15
0
        public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
        {
            _baseUrl = $"{node.Url}/databases/{node.Database}";

            var request = new HttpRequestMessage
            {
                Method  = HttpMethod.Post,
                Content = new BlittableJsonContent(stream =>
                {
                    using (var writer = new BlittableJsonTextWriter(ctx, stream))
                    {
                        writer.WriteStartObject();

                        var first = true;
                        writer.WritePropertyName("Requests");
                        writer.WriteStartArray();
                        foreach (var command in _commands)
                        {
                            if (first == false)
                            {
                                writer.WriteComma();
                            }

                            first        = false;
                            var cacheKey = GetCacheKey(command, out string _);
                            using (_cache.Get(ctx, cacheKey, out string cachedChangeVector, out var _))
                            {
                                var headers = new DynamicJsonValue();
                                if (cachedChangeVector != null)
                                {
                                    headers["If-None-Match"] = $"\"{cachedChangeVector}\"";
                                }

                                foreach (var header in command.Headers)
                                {
                                    headers[header.Key] = header.Value;
                                }

                                writer.WriteStartObject();

                                writer.WritePropertyName(nameof(GetRequest.Url));
                                writer.WriteString($"/databases/{node.Database}{command.Url}");
                                writer.WriteComma();

                                writer.WritePropertyName(nameof(GetRequest.Query));
                                writer.WriteString(command.Query);
                                writer.WriteComma();

                                writer.WritePropertyName(nameof(GetRequest.Method));
                                writer.WriteString(command.Method?.Method);
                                writer.WriteComma();

                                writer.WritePropertyName(nameof(GetRequest.Headers));
                                writer.WriteStartObject();
                                var firstInner = true;
                                foreach (var kvp in command.Headers)
                                {
                                    if (firstInner == false)
                                    {
                                        writer.WriteComma();
                                    }

                                    firstInner = false;
                                    writer.WritePropertyName(kvp.Key);
                                    writer.WriteString(kvp.Value);
                                }
                                writer.WriteEndObject();
                                writer.WriteComma();

                                writer.WritePropertyName(nameof(GetRequest.Content));
                                if (command.Content != null)
                                {
                                    command.Content.WriteContent(writer, ctx);
                                }
                                else
                                {
                                    writer.WriteNull();
                                }

                                writer.WriteEndObject();
                            }
                        }
                        writer.WriteEndArray();

                        writer.WriteEndObject();
                    }
                })
            };

            url = $"{_baseUrl}/multi_get";

            return(request);
        }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                var path = new StringBuilder(node.Url)
                           .Append("/databases/")
                           .Append(node.Database)
                           .Append("/queries")
                           .Append("?allowStale=")
                           .Append(_options.AllowStale)
                           .Append("&maxOpsPerSec=")
                           .Append(_options.MaxOpsPerSecond)
                           .Append("&details=")
                           .Append(_options.RetrieveDetails);

                if (_options.StaleTimeout != null)
                {
                    path
                    .Append("&staleTimeout=")
                    .Append(_options.StaleTimeout.Value);
                }

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Delete,
                    Content = new BlittableJsonContent(stream =>
                    {
                        using (var writer = new BlittableJsonTextWriter(ctx, stream))
                        {
                            writer.WriteIndexQuery(_conventions, ctx, _queryToDelete);
                        }
                    }
                                                       )
                };

                url = path.ToString();
                return(request);
            }
Exemple #17
0
                public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
                {
                    url = $"{node.Url}/cluster/node-info";

                    return(new HttpRequestMessage
                    {
                        Method = HttpMethod.Get
                    });
                }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/migrate/offline";

                return(new HttpRequestMessage
                {
                    Method = HttpMethod.Post,
                    Content = new BlittableJsonContent(stream =>
                    {
                        var config = DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(_configuration, ctx);
                        ctx.Write(stream, config);
                    })
                });
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/admin/tasks/pull-replication/hub";

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Put,
                    Content = new BlittableJsonContent(stream =>
                    {
                        ctx.Write(stream, ctx.ReadObject(_pullReplicationDefinition.ToJson(), "update-pull-replication-definition"));
                    })
                };

                return(request);
            }
                public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
                {
                    url = $"{node.Url}/admin/configuration/studio";

                    return(new HttpRequestMessage
                    {
                        Method = HttpMethod.Put,
                        Content = new BlittableJsonContent(stream =>
                        {
                            ctx.Write(stream, _configuration);
                        })
                    });
                }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/cmpxchg?key={_key}&index={_index}";
                //var tuple = ("Object", _value);
                var tuple = new Dictionary <string, T>
                {
                    ["Object"] = _value
                };
                var blit = EntityToBlittable.ConvertEntityToBlittable(tuple, _conventions, ctx);

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethods.Put,
                    Content = new BlittableJsonContent(stream =>
                    {
                        ctx.Write(stream, blit);
                    })
                };

                return(request);
            }
                public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
                {
                    url = $"{node.Url}/databases/{node.Database}/configuration/studio";

                    var request = new HttpRequestMessage
                    {
                        Method = HttpMethod.Get
                    };

                    return(request);
                }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/databases/node?name={_databaseName}";
                if (string.IsNullOrEmpty(_node) == false)
                {
                    url += $"&node={_node}";
                }

                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Put
                };

                return(request);
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/cmpxchg?key={Uri.EscapeDataString(_key)}&index={_index}";
                var request = new HttpRequestMessage
                {
                    Method = HttpMethods.Delete,
                };

                return(request);
            }
Exemple #25
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/indexes/set-lock?name={Uri.EscapeDataString(_indexName)}&mode={_mode}";

                return(new HttpRequestMessage
                {
                    Method = HttpMethod.Post
                });
            }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                var path = new StringBuilder(node.Url).Append("/admin/certificates?metadataOnly=true");

                if (string.IsNullOrEmpty(_name) == false)
                {
                    path.Append("&name=").Append(Uri.EscapeDataString(_name));
                }

                url = path.ToString();
                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Get
                };

                return(request);
            }
Exemple #27
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/databases?name={node.Database}";

                return(new HttpRequestMessage
                {
                    Method = HttpMethod.Get,
                });
            }
Exemple #28
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/admin/etl?id={_taskId}";

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Put,
                    Content = new BlittableJsonContent(stream =>
                    {
                        var config = DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(_configuration, ctx);
                        ctx.Write(stream, config);
                    })
                };

                return(request);
            }
Exemple #29
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{_databaseName}/admin/tasks/external-replication";

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Post,
                    Content = new BlittableJsonContent(stream =>
                    {
                        var json = new DynamicJsonValue
                        {
                            ["Watcher"] = _newWatcher.ToJson()
                        };

                        ctx.Write(stream, ctx.ReadObject(json, "update-replication"));
                    })
                };

                return(request);
            }
        /// <summary>
        /// 调用服务
        /// </summary>
        /// <param name="reqMsg"></param>
        /// <returns></returns>
        public ResponseMessage CallService(RequestMessage reqMsg)
        {
            IList<IService> proxies = new List<IService>();

            //判断是否为StatusService服务
            if (reqMsg.ServiceName == typeof(IStatusService).FullName)
            {
                throw new WarningException("Status service can't use discover service way!");
            }

            //如果能找到服务
            if (services.ContainsKey(reqMsg.ServiceName))
            {
                proxies = services[reqMsg.ServiceName];
            }
            else
            {
                //找到代理服务
                lock (services)
                {
                    //代理数为1时,直接处理
                    if (factory.Proxies.Count == 1)
                    {
                        proxies.Add(factory.Proxies[0]);
                        services[reqMsg.ServiceName] = proxies;
                    }
                    else
                    {
                        foreach (var proxy in factory.Proxies)
                        {
                            try
                            {
                                //自定义实现一个ServerNode
                                var node = new ServerNode
                                {
                                    IP = proxy.Node.IP,
                                    Port = proxy.Node.Port,
                                    Compress = proxy.Node.Compress,
                                    Encrypt = proxy.Node.Encrypt,
                                    Key = Guid.NewGuid().ToString(),
                                    MaxPool = 1,
                                    Timeout = 30
                                };

                                var service = factory.GetChannel<IStatusService>(node);

                                //检测是否存在服务
                                if (service.ContainsService(reqMsg.ServiceName))
                                {
                                    proxies.Add(proxy);
                                }
                            }
                            catch (WarningException ex)
                            {
                                throw ex;
                            }
                        }
                    }

                    //缓存代理服务
                    if (proxies.Count > 0)
                        services[reqMsg.ServiceName] = proxies;
                    else
                        throw new WarningException(string.Format("Did not find the proxy service {0}!", reqMsg.ServiceName));
                }
            }

            //随机获取一个代理,实现分布式处理
            var rndIndex = new Random(Guid.NewGuid().GetHashCode()).Next(proxies.Count);
            return proxies[rndIndex].CallService(reqMsg);
        }
Exemple #31
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/databases/{node.Database}/admin/sorters";

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Put,
                    Content = new BlittableJsonContent(async stream =>
                    {
                        await using (var writer = new AsyncBlittableJsonTextWriter(ctx, stream))
                        {
                            writer.WriteStartObject();
                            writer.WriteArray("Sorters", _sortersToAdd);
                            writer.WriteEndObject();
                        }
                    })
                };

                return(request);
            }
 public CallbackProxy(object callback, ServerNode node, ILog logger)
     : base(node, logger)
 {
     this.callback = callback;
 }
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/replication/conflicts/solver?name={_databaseName}";

                var request = new HttpRequestMessage
                {
                    Method  = HttpMethod.Post,
                    Content = new BlittableJsonContent(async stream =>
                    {
                        var solver = DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(new ConflictSolver
                        {
                            ResolveByCollection = _solver.CollectionByScript,
                            ResolveToLatest     = _solver.ResolveToLatest,
                        }, ctx);
                        await ctx.WriteAsync(stream, solver).ConfigureAwait(false);
                    })
                };

                return(request);
            }
        protected void OnAddServerButtonClicked(object sender, System.EventArgs e)
        {
            ServerNode node = new ServerNode("", 0);
            serverStore.AddNode(node);
            serverNodes.Add(node);

            List<string> addresses = Config.Instance.GetStringList("ServerList.Addresses");
            List<int> ports = Config.Instance.GetIntegerList("ServerList.Ports");
            addresses.Add(node.Address);
            ports.Add(node.Port);
            Config.Instance.SetStringList("ServerList.Addresses", addresses);
            Config.Instance.SetIntegerList("ServerList.Ports", ports);
        }
Exemple #35
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/databases/promote?name={_databaseName}&node={_node}";

                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Post
                };

                return(request);
            }
Exemple #36
0
            public override HttpRequestMessage CreateRequest(JsonOperationContext ctx, ServerNode node, out string url)
            {
                url = $"{node.Url}/admin/databases/unused-ids?name={_database}";

                return(new HttpRequestMessage
                {
                    Method = HttpMethod.Post,
                    Content = new BlittableJsonContent(stream =>
                    {
                        ctx.Write(stream, DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(_parameters, ctx));
                    })
                });
            }
        /// <summary>
        /// 从配置文件加载配置值
        /// </summary>
        /// <param name="xmlnode"></param>
        public void LoadValuesFromConfigurationXml(XmlNode xmlnode)
        {
            if (xmlnode == null) return;

            XmlAttributeCollection attribute = xmlnode.Attributes;

            if (attribute["type"] != null && attribute["type"].Value.Trim() != string.Empty)
                type = (CastleFactoryType)Enum.Parse(typeof(CastleFactoryType), attribute["type"].Value, true);

            if (attribute["throwError"] != null && attribute["throwError"].Value.Trim() != string.Empty)
                throwError = Convert.ToBoolean(attribute["throwError"].Value);

            if (attribute["default"] != null && attribute["default"].Value.Trim() != string.Empty)
                defaultKey = attribute["default"].Value;

            if (attribute["appname"] != null && attribute["appname"].Value.Trim() != string.Empty)
                appname = attribute["appname"].Value;

            foreach (XmlNode child in xmlnode.ChildNodes)
            {
                if (child.NodeType == XmlNodeType.Comment) continue;

                XmlAttributeCollection childattribute = child.Attributes;
                if (child.Name == "serverNode")
                {
                    var node = new ServerNode();
                    node.Key = childattribute["key"].Value;
                    node.IP = childattribute["ip"].Value;
                    node.Port = Convert.ToInt32(childattribute["port"].Value);

                    //超时时间,默认为1分钟
                    if (childattribute["timeout"] != null && childattribute["timeout"].Value.Trim() != string.Empty)
                        node.Timeout = Convert.ToInt32(childattribute["timeout"].Value);

                    //最大连接池
                    if (childattribute["maxpool"] != null && childattribute["maxpool"].Value.Trim() != string.Empty)
                        node.MaxPool = Convert.ToInt32(childattribute["maxpool"].Value);

                    //最小连接池
                    if (childattribute["minpool"] != null && childattribute["minpool"].Value.Trim() != string.Empty)
                        node.MinPool = Convert.ToInt32(childattribute["minpool"].Value);

                    if (childattribute["encrypt"] != null && childattribute["encrypt"].Value.Trim() != string.Empty)
                        node.Encrypt = Convert.ToBoolean(childattribute["encrypt"].Value);

                    if (childattribute["compress"] != null && childattribute["compress"].Value.Trim() != string.Empty)
                        node.Compress = Convert.ToBoolean(childattribute["compress"].Value);

                    if (childattribute["format"] != null && childattribute["format"].Value.Trim() != string.Empty)
                        node.Format = (TransferType)Enum.Parse(typeof(TransferType), childattribute["format"].Value, true);

                    //处理默认的服务
                    if (string.IsNullOrEmpty(defaultKey))
                    {
                        defaultKey = node.Key;
                    }

                    if (nodes.ContainsKey(node.Key))
                        throw new WarningException("Already exists server node 【" + node.Key + "】.");

                    nodes[node.Key] = node;
                }
            }

            if (type != CastleFactoryType.Local)
            {
                //如果app名称为空
                if (string.IsNullOrEmpty(appname))
                {
                    throw new WarningException("App name must be provided!");
                }

                //判断是否配置了服务信息
                if (nodes.Count == 0)
                {
                    throw new WarningException("Not configure any service node!");
                }

                //判断是否包含默认的服务
                if (!nodes.ContainsKey(defaultKey))
                {
                    throw new WarningException("Not find the default service node 【" + defaultKey + "】!");
                }
            }
        }
 /// <summary>
 /// Invoke 代理
 /// </summary>
 /// <param name="node"></param>
 /// <param name="logger"></param>
 public InvokeProxy(ServerNode node, ILog logger)
     : base(node, logger)
 {
     //TO DO
 }