diff --git a/Shemes/Network.graphml b/Shemes/Network.graphml
new file mode 100644
index 0000000..9bcb6a4
--- /dev/null
+++ b/Shemes/Network.graphml
@@ -0,0 +1,687 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NetworkStreamFastObfuscator
+
+
+
+
+
+
+
+
+
+
+ ExchangeTransportFactory
+
+
+
+
+
+
+
+
+
+
+ IExService
+
+
+
+
+
+
+
+
+
+
+ IExClient
+
+
+
+
+
+
+
+
+
+
+ ZBaseNetwork
+
+
+
+
+
+
+
+
+
+
+ ZSocketClient
+
+
+
+
+
+
+
+
+
+
+ ZSocketServer
+
+
+
+
+
+
+
+
+
+
+ <ZSocketServerClient>
+
+
+
+
+
+
+
+
+
+
+ IZTransport
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ExClient
+
+
+
+
+
+
+
+
+
+
+ IExClient
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IZBackward
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ExRouter
+
+
+
+
+
+
+
+
+
+
+ ExService
+
+
+
+
+
+
+
+
+
+
+ IExService
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IZObservableServer
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FrameExchange
+
+
+
+
+
+
+
+
+
+
+ FrameBuilder
+
+
+
+
+
+
+
+
+
+
+ FrameParser
+
+
+
+
+
+
+
+
+
+
+ ZExSocketObservableServer
+
+
+
+
+
+
+
+
+
+
+ ExServiceHost
+
+
+
+
+
+
+
+
+
+
+ IDiscoveryClient
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IExchangeService
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RegisterService
+
+
+
+
+
+
+
+
+
+
+ RegisterService
+
+
+
+
+
+
+
+
+
+
+ MicroserviceInfo
+
+
+
+
+
+
+
+
+
+
+ DiscoveryClient
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZeroLevel.Discovery/App.config b/ZeroLevel.Discovery/App.config
index f91f31e..8ac5084 100644
--- a/ZeroLevel.Discovery/App.config
+++ b/ZeroLevel.Discovery/App.config
@@ -5,7 +5,8 @@
-
+
+
diff --git a/ZeroLevel.Discovery/DiscoveryService.cs b/ZeroLevel.Discovery/DiscoveryService.cs
index f48cf3c..5665a7c 100644
--- a/ZeroLevel.Discovery/DiscoveryService.cs
+++ b/ZeroLevel.Discovery/DiscoveryService.cs
@@ -1,10 +1,18 @@
-using ZeroLevel.Services.Applications;
+using System.Collections;
+using System.Collections.Generic;
+using ZeroLevel.Models;
+using ZeroLevel.Network;
+using ZeroLevel.Network.Microservices;
+using ZeroLevel.Services.Applications;
+using ZeroLevel.Services.Network;
namespace ZeroLevel.Discovery
{
public sealed class DiscoveryService
: BaseWindowsService, IZeroService
{
+ private IExService _exInbox;
+
public DiscoveryService()
: base("Discovery")
{
@@ -20,13 +28,23 @@ namespace ZeroLevel.Discovery
public override void StartAction()
{
- Injector.Default.Register(new RouteTable());
- var port = Configuration.Default.First("port");
+ var routeTable = new RouteTable();
+
+ Injector.Default.Register(routeTable);
+ var port = Configuration.Default.First("apiport");
Startup.StartWebPanel(port, false);
+
+ var socketPort = Configuration.Default.First("socketport");
+ _exInbox = ExchangeTransportFactory.GetServer("socket", socketPort);
+ _exInbox.RegisterInbox>("services", (_, __) => routeTable.Get());
+ _exInbox.RegisterInbox("register", (info, _, __) => routeTable.Append(info));
+
+ Log.Info($"TCP server started on port {socketPort}");
}
public override void StopAction()
{
+ _exInbox.Dispose();
}
}
}
\ No newline at end of file
diff --git a/ZeroLevel.Discovery/RouteTable.cs b/ZeroLevel.Discovery/RouteTable.cs
index 699dfbe..2d46f5d 100644
--- a/ZeroLevel.Discovery/RouteTable.cs
+++ b/ZeroLevel.Discovery/RouteTable.cs
@@ -4,8 +4,8 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
-using ZeroLevel.Microservices;
using ZeroLevel.Models;
+using ZeroLevel.Network;
using ZeroLevel.Network.Microservices;
namespace ZeroLevel.Discovery
diff --git a/ZeroLevel.Discovery/ZeroLevel.Discovery.csproj b/ZeroLevel.Discovery/ZeroLevel.Discovery.csproj
index 299b78e..3028b5e 100644
--- a/ZeroLevel.Discovery/ZeroLevel.Discovery.csproj
+++ b/ZeroLevel.Discovery/ZeroLevel.Discovery.csproj
@@ -77,7 +77,6 @@
Component
-
diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache
index ffd6fd9..8950e52 100644
--- a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache
+++ b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csproj.CoreCompileInputs.cache
@@ -1 +1 @@
-4f0bbfe8ac44b56784f7eeaa3cdef96609d6b97e
+fe8032ac49bedc0ec84767ee0419b2fc618b5766
diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache
index dca3baa..7e437ec 100644
Binary files a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache and b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache differ
diff --git a/ZeroLevel.Microservices/BaseProxy.cs b/ZeroLevel.Microservices/BaseProxy.cs
deleted file mode 100644
index 5b2d19f..0000000
--- a/ZeroLevel.Microservices/BaseProxy.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Text;
-
-namespace ZeroLevel.ProxyREST
-{
- public abstract class BaseProxy
- {
- private readonly string _baseUrl;
-
- private Uri BuildRequestUrl(string baseUri, string resource, IDictionary parameters)
- {
- if (null == resource) throw new ArgumentNullException("resource");
- var stringBuilder = new StringBuilder(baseUri);
- if (baseUri[baseUri.Length - 1] != '/')
- stringBuilder.Append('/');
- if (resource[0] != '/')
- {
- stringBuilder.Append(resource);
- }
- else
- {
- stringBuilder.Append(resource.Substring(1));
- }
- parameters.
- Do(list =>
- {
- if (list.Count > 0)
- {
- stringBuilder.Append("?");
- foreach (string key in list.Keys)
- {
- var val = list[key];
- if (val == null)
- {
- stringBuilder.Append(key);
- }
- else
- {
- var vtype = val.GetType();
- if (vtype.IsArray)
- {
- if (vtype.GetElementType() == typeof(string))
- {
- var arr = (string[])val;
- stringBuilder.Append(string.Join("&", arr.Select(i => string.Format("{0}[]={1}", key, i))));
- }
- else
- {
- var arr = (object[])val;
- stringBuilder.Append(string.Join("&", arr.Select(i => string.Format("{0}[]={1}", key, JsonConvert.SerializeObject(i)))));
- }
- }
- else
- {
- if (vtype == typeof(string))
- {
- stringBuilder.AppendFormat("{0}={1}", key, val);
- }
- else
- {
- stringBuilder.AppendFormat("{0}={1}", key, JsonConvert.SerializeObject(val));
- }
- }
- }
- stringBuilder.Append("&");
- }
- }
- });
- return new Uri(stringBuilder.ToString().TrimEnd('&'));
- }
-
- protected T SendRequest(string resource, string method, object body, IDictionary parameters = null)
- {
- string statusCode = null;
- string reason = null;
- try
- {
- var request = (HttpWebRequest)WebRequest.Create(BuildRequestUrl(_baseUrl, resource, parameters));
- request.UseDefaultCredentials = true;
- request.Method = method;
- request.Proxy = null;
- request.AutomaticDecompression = DecompressionMethods.GZip;
- if (body != null)
- {
- request.Accept = "application/json";
- request.ContentType = "application/json";
- using (var streamWriter = new StreamWriter(request.GetRequestStream()))
- {
- streamWriter.Write(JsonConvert.SerializeObject(body));
- streamWriter.Flush();
- }
- }
- using (var response = (HttpWebResponse)request.GetResponse())
- {
- statusCode = response.StatusCode.ToString();
- reason = response.StatusDescription;
- if (response.StatusCode == HttpStatusCode.OK)
- {
- using (var stream = new StreamReader(response.GetResponseStream()))
- {
- string json = stream.ReadToEnd();
- return JsonConvert.DeserializeObject(json);
- }
- }
- else
- {
- throw new Exception("Bad status code");
- }
- }
- }
- catch (Exception ex)
- {
- var line = $"Resource request failed. [{method}] {resource}. Error code: {(statusCode ?? "Uncknown")}. Comment: {(reason ?? ex.Message)}";
- Log.Error(ex, line);
- throw new InvalidOperationException(line, ex);
- }
- }
-
- protected T GET(string resource, IDictionary parameters = null)
- {
- return SendRequest(resource, "GET", null, parameters);
- }
-
- protected T POST(string resource, object body, IDictionary parameters = null)
- {
- return SendRequest(resource, "POST", body, parameters);
- }
-
- protected T DELETE(string resource, object body, IDictionary parameters = null)
- {
- return SendRequest(resource, "DELETE", body, parameters);
- }
-
- static BaseProxy()
- {
- ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
- ServicePointManager.Expect100Continue = false;
- ServicePointManager.DefaultConnectionLimit = 8;
- }
-
- public BaseProxy(string baseUri)
- {
- if (false == baseUri.EndsWith("/"))
- _baseUrl = baseUri + "/";
- else
- _baseUrl = baseUri;
- }
- }
-}
\ No newline at end of file
diff --git a/ZeroLevel.Microservices/ExchangeTransportFactory.cs b/ZeroLevel.Microservices/ExchangeTransportFactory.cs
deleted file mode 100644
index f46fd78..0000000
--- a/ZeroLevel.Microservices/ExchangeTransportFactory.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Reflection;
-using ZeroLevel.Network.Microservices;
-using ZeroLevel.Services.Network;
-using ZeroLevel.Services.Network.Contract;
-
-namespace ZeroLevel.Microservices
-{
- internal static class ExchangeTransportFactory
- {
- private static readonly Dictionary _customServers = new Dictionary();
- private static readonly Dictionary _customClients = new Dictionary();
- private static readonly ConcurrentDictionary _clientInstances = new ConcurrentDictionary();
-
- ///
- /// Scanning the specified assembly to find the types that implement the IExchangeServer or IExchangeClient interfaces
- ///
- internal static void ScanAndRegisterCustomTransport(Assembly asm)
- {
- foreach (var type in asm.GetExportedTypes())
- {
- var serverAttr = type.GetCustomAttribute();
- if (serverAttr != null &&
- string.IsNullOrWhiteSpace(serverAttr.Protocol) == false &&
- typeof(IZObservableServer).IsAssignableFrom(type))
- {
- _customServers[serverAttr.Protocol] = type;
- }
- var clientAttr = type.GetCustomAttribute();
- if (clientAttr != null &&
- string.IsNullOrWhiteSpace(clientAttr.Protocol) == false &&
- typeof(IZTransport).IsAssignableFrom(type))
- {
- _customClients[clientAttr.Protocol] = type;
- }
- }
- }
-
- ///
- /// Creates a server to receive messages using the specified protocol
- ///
- /// Protocol
- /// Server
- internal static ExService GetServer(string protocol)
- {
- ExService instance = null;
- if (protocol.Equals("socket", StringComparison.OrdinalIgnoreCase))
- {
- instance = new ExService(new ZExSocketObservableServer(new System.Net.IPEndPoint(IPFinder.GetNonLoopbackAddress(), IPFinder.GetFreeTcpPort())));
- }
- else
- {
- var key = protocol.Trim().ToLowerInvariant();
- if (_customServers.ContainsKey(key))
- {
- instance = new ExService((IZObservableServer)Activator.CreateInstance(_customServers[key]));
- }
- }
- if (instance != null)
- {
- return instance;
- }
- throw new NotSupportedException($"Protocol {protocol} not supported");
- }
-
- ///
- /// Creates a client to access the server using the specified protocol
- ///
- /// Protocol
- /// Server endpoint
- /// Client
- internal static ExClient GetClient(string protocol, string endpoint)
- {
- ExClient instance = null;
- var cachee_key = $"{protocol}:{endpoint}";
- if (_clientInstances.ContainsKey(cachee_key))
- {
- instance = _clientInstances[cachee_key];
- if (instance.Status == ZTransportStatus.Working)
- {
- return instance;
- }
- _clientInstances.TryRemove(cachee_key, out instance);
- instance.Dispose();
- instance = null;
- }
- if (protocol.Equals("socket", StringComparison.OrdinalIgnoreCase))
- {
- instance = new ExClient(new ZSocketClient(SocketExtensions.CreateIPEndPoint(endpoint)));
- }
- else
- {
- var key = protocol.Trim().ToLowerInvariant();
- if (_customClients.ContainsKey(key))
- {
- instance = new ExClient((IZTransport)Activator.CreateInstance(_customClients[key], new object[] { endpoint }));
- }
- }
- if (instance != null)
- {
- _clientInstances[cachee_key] = instance;
- return instance;
- }
- throw new NotSupportedException($"Protocol {protocol} not supported");
- }
- }
-}
\ No newline at end of file
diff --git a/ZeroLevel.Microservices/Properties/AssemblyInfo.cs b/ZeroLevel.Microservices/Properties/AssemblyInfo.cs
deleted file mode 100644
index 916d4b4..0000000
--- a/ZeroLevel.Microservices/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ZeroLevel.Microservices")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("ZeroLevel.Microservices")]
-[assembly: AssemblyCopyright("Copyright © 2019")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("6452d91a-2dac-4982-83af-77472051e81b")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
\ No newline at end of file
diff --git a/ZeroLevel.Microservices/ZeroLevel.Microservices.csproj b/ZeroLevel.Microservices/ZeroLevel.Microservices.csproj
deleted file mode 100644
index 5df2e61..0000000
--- a/ZeroLevel.Microservices/ZeroLevel.Microservices.csproj
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}
- Library
- Properties
- ZeroLevel.Microservices
- ZeroLevel.Microservices
- v4.7.2
- 512
- true
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
- ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {37020d8d-34e8-4ec3-a447-8396d5080457}
- ZeroLevel
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ZeroLevel.Microservices/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/ZeroLevel.Microservices/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
deleted file mode 100644
index e69de29..0000000
diff --git a/ZeroLevel.Microservices/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/ZeroLevel.Microservices/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
deleted file mode 100644
index e69de29..0000000
diff --git a/ZeroLevel.Microservices/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/ZeroLevel.Microservices/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
deleted file mode 100644
index e69de29..0000000
diff --git a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache b/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache
deleted file mode 100644
index 104314d..0000000
--- a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csproj.CoreCompileInputs.cache
+++ /dev/null
@@ -1 +0,0 @@
-48781ba1f58e845d50aedda0cbff5881dfe0563f
diff --git a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csprojAssemblyReference.cache b/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csprojAssemblyReference.cache
deleted file mode 100644
index 581de84..0000000
Binary files a/ZeroLevel.Microservices/obj/Debug/ZeroLevel.Microservices.csprojAssemblyReference.cache and /dev/null differ
diff --git a/ZeroLevel.Microservices/packages.config b/ZeroLevel.Microservices/packages.config
deleted file mode 100644
index 97c22dc..0000000
--- a/ZeroLevel.Microservices/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/ZeroLevel.sln b/ZeroLevel.sln
index aef504b..444fdaa 100644
--- a/ZeroLevel.sln
+++ b/ZeroLevel.sln
@@ -5,8 +5,6 @@ VisualStudioVersion = 15.0.28307.421
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZeroLevel", "ZeroLevel\ZeroLevel.csproj", "{37020D8D-34E8-4EC3-A447-8396D5080457}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZeroLevel.Microservices", "ZeroLevel.Microservices\ZeroLevel.Microservices.csproj", "{6452D91A-2DAC-4982-83AF-77472051E81B}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZeroLevel.Discovery", "ZeroLevel.Discovery\ZeroLevel.Discovery.csproj", "{4F55B23F-938C-4DA2-B6DC-B6BC66D36073}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZeroExample", "ZeroExample\ZeroExample.csproj", "{50CEBEC2-2571-4592-AFD2-970BDB41947B}"
@@ -33,18 +31,6 @@ Global
{37020D8D-34E8-4EC3-A447-8396D5080457}.Release|x64.Build.0 = Release|Any CPU
{37020D8D-34E8-4EC3-A447-8396D5080457}.Release|x86.ActiveCfg = Release|Any CPU
{37020D8D-34E8-4EC3-A447-8396D5080457}.Release|x86.Build.0 = Release|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Debug|x64.Build.0 = Debug|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Debug|x86.Build.0 = Debug|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Release|Any CPU.Build.0 = Release|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Release|x64.ActiveCfg = Release|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Release|x64.Build.0 = Release|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Release|x86.ActiveCfg = Release|Any CPU
- {6452D91A-2DAC-4982-83AF-77472051E81B}.Release|x86.Build.0 = Release|Any CPU
{4F55B23F-938C-4DA2-B6DC-B6BC66D36073}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4F55B23F-938C-4DA2-B6DC-B6BC66D36073}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4F55B23F-938C-4DA2-B6DC-B6BC66D36073}.Debug|x64.ActiveCfg = Debug|Any CPU
diff --git a/ZeroLevel/Services/Network/Contract/IExClient.cs b/ZeroLevel/Services/Network/Contract/IExClient.cs
index d267db6..a4f7193 100644
--- a/ZeroLevel/Services/Network/Contract/IExClient.cs
+++ b/ZeroLevel/Services/Network/Contract/IExClient.cs
@@ -5,9 +5,14 @@ using ZeroLevel.Models;
namespace ZeroLevel.Services.Network
{
public interface IExClient
+ : IDisposable
{
event Action Connected;
+ void ForceConnect();
+
+ ZTransportStatus Status { get; }
+
IPEndPoint Endpoint { get; }
InvokeResult Send(T obj);
diff --git a/ZeroLevel.Discovery/ExchangeTransportFactory.cs b/ZeroLevel/Services/Network/ExchangeTransportFactory.cs
similarity index 81%
rename from ZeroLevel.Discovery/ExchangeTransportFactory.cs
rename to ZeroLevel/Services/Network/ExchangeTransportFactory.cs
index f46fd78..48c0806 100644
--- a/ZeroLevel.Discovery/ExchangeTransportFactory.cs
+++ b/ZeroLevel/Services/Network/ExchangeTransportFactory.cs
@@ -6,13 +6,13 @@ using ZeroLevel.Network.Microservices;
using ZeroLevel.Services.Network;
using ZeroLevel.Services.Network.Contract;
-namespace ZeroLevel.Microservices
+namespace ZeroLevel.Network
{
- internal static class ExchangeTransportFactory
+ public static class ExchangeTransportFactory
{
private static readonly Dictionary _customServers = new Dictionary();
private static readonly Dictionary _customClients = new Dictionary();
- private static readonly ConcurrentDictionary _clientInstances = new ConcurrentDictionary();
+ private static readonly ConcurrentDictionary _clientInstances = new ConcurrentDictionary();
///
/// Scanning the specified assembly to find the types that implement the IExchangeServer or IExchangeClient interfaces
@@ -43,12 +43,12 @@ namespace ZeroLevel.Microservices
///
/// Protocol
/// Server
- internal static ExService GetServer(string protocol)
+ public static IExService GetServer(string protocol, int port = -1)
{
ExService instance = null;
if (protocol.Equals("socket", StringComparison.OrdinalIgnoreCase))
{
- instance = new ExService(new ZExSocketObservableServer(new System.Net.IPEndPoint(IPFinder.GetNonLoopbackAddress(), IPFinder.GetFreeTcpPort())));
+ instance = new ExService(new ZExSocketObservableServer(new System.Net.IPEndPoint(NetUtils.GetNonLoopbackAddress(), port == -1 ? NetUtils.GetFreeTcpPort() : port)));
}
else
{
@@ -64,16 +64,15 @@ namespace ZeroLevel.Microservices
}
throw new NotSupportedException($"Protocol {protocol} not supported");
}
-
///
/// Creates a client to access the server using the specified protocol
///
/// Protocol
/// Server endpoint
/// Client
- internal static ExClient GetClient(string protocol, string endpoint)
+ public static IExClient GetClientWithCache(string protocol, string endpoint)
{
- ExClient instance = null;
+ IExClient instance = null;
var cachee_key = $"{protocol}:{endpoint}";
if (_clientInstances.ContainsKey(cachee_key))
{
@@ -86,9 +85,17 @@ namespace ZeroLevel.Microservices
instance.Dispose();
instance = null;
}
+ instance = GetClient(protocol, endpoint);
+ _clientInstances[cachee_key] = instance;
+ return instance;
+ }
+
+ public static IExClient GetClient(string protocol, string endpoint)
+ {
+ ExClient instance = null;
if (protocol.Equals("socket", StringComparison.OrdinalIgnoreCase))
{
- instance = new ExClient(new ZSocketClient(SocketExtensions.CreateIPEndPoint(endpoint)));
+ instance = new ExClient(new ZSocketClient(NetUtils.CreateIPEndPoint(endpoint)));
}
else
{
@@ -100,7 +107,6 @@ namespace ZeroLevel.Microservices
}
if (instance != null)
{
- _clientInstances[cachee_key] = instance;
return instance;
}
throw new NotSupportedException($"Protocol {protocol} not supported");
diff --git a/ZeroLevel.Microservices/Model/Checkpoint.cs b/ZeroLevel/Services/Network/Microservices/Checkpoint.cs
similarity index 98%
rename from ZeroLevel.Microservices/Model/Checkpoint.cs
rename to ZeroLevel/Services/Network/Microservices/Checkpoint.cs
index 05d7401..7d313b1 100644
--- a/ZeroLevel.Microservices/Model/Checkpoint.cs
+++ b/ZeroLevel/Services/Network/Microservices/Checkpoint.cs
@@ -2,7 +2,7 @@
using System.Runtime.Serialization;
using ZeroLevel.Services.Serialization;
-namespace ZeroLevel.Microservices.Model
+namespace ZeroLevel.Network.Microservices
{
[DataContract]
public class Checkpoint :
diff --git a/ZeroLevel.Microservices/Model/CheckpointArc.cs b/ZeroLevel/Services/Network/Microservices/CheckpointArc.cs
similarity index 93%
rename from ZeroLevel.Microservices/Model/CheckpointArc.cs
rename to ZeroLevel/Services/Network/Microservices/CheckpointArc.cs
index fad92bc..8d0d59d 100644
--- a/ZeroLevel.Microservices/Model/CheckpointArc.cs
+++ b/ZeroLevel/Services/Network/Microservices/CheckpointArc.cs
@@ -1,6 +1,6 @@
using System.Runtime.Serialization;
-namespace ZeroLevel.Microservices.Model
+namespace ZeroLevel.Network.Microservices
{
[DataContract]
public sealed class CheckpointArc
diff --git a/ZeroLevel.Microservices/Model/CheckpointType.cs b/ZeroLevel/Services/Network/Microservices/CheckpointType.cs
similarity index 73%
rename from ZeroLevel.Microservices/Model/CheckpointType.cs
rename to ZeroLevel/Services/Network/Microservices/CheckpointType.cs
index 1f360f4..352b702 100644
--- a/ZeroLevel.Microservices/Model/CheckpointType.cs
+++ b/ZeroLevel/Services/Network/Microservices/CheckpointType.cs
@@ -1,4 +1,4 @@
-namespace ZeroLevel.Microservices.Model
+namespace ZeroLevel.Network.Microservices
{
public enum CheckpointType
{
diff --git a/ZeroLevel.Microservices/WebApiDiscoveryClient.cs b/ZeroLevel/Services/Network/Microservices/DiscoveryClient.cs
similarity index 54%
rename from ZeroLevel.Microservices/WebApiDiscoveryClient.cs
rename to ZeroLevel/Services/Network/Microservices/DiscoveryClient.cs
index 5c5f440..8b52894 100644
--- a/ZeroLevel.Microservices/WebApiDiscoveryClient.cs
+++ b/ZeroLevel/Services/Network/Microservices/DiscoveryClient.cs
@@ -3,31 +3,16 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
-using ZeroLevel.Microservices.Contracts;
using ZeroLevel.Models;
+using ZeroLevel.Network;
using ZeroLevel.Network.Microservices;
-using ZeroLevel.ProxyREST;
using ZeroLevel.Services.Collections;
-namespace ZeroLevel.Microservices
+namespace ZeroLevel.Services.Network.Microservices
{
- public sealed class WebApiDiscoveryClient :
- BaseProxy, IDiscoveryClient
+ public class DiscoveryClient
+ : IDiscoveryClient
{
- #region WebAPI
-
- private IEnumerable GetRecords()
- {
- return GET>("api/v0/routes");
- }
-
- public InvokeResult Post(MicroserviceInfo info)
- {
- return POST("api/v0/routes", info);
- }
-
- #endregion WebAPI
-
private readonly ConcurrentDictionary> _tableByKey =
new ConcurrentDictionary>();
@@ -38,10 +23,11 @@ namespace ZeroLevel.Microservices
new ConcurrentDictionary>();
private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
+ private readonly IExClient _discoveryServerClient;
- public WebApiDiscoveryClient(string url)
- : base(url)
+ public DiscoveryClient(string protocol, string endpoint)
{
+ _discoveryServerClient = ExchangeTransportFactory.GetClient(protocol, endpoint);
UpdateServiceListInfo();
Sheduller.RemindEvery(TimeSpan.FromSeconds(30), UpdateServiceListInfo);
}
@@ -79,63 +65,89 @@ namespace ZeroLevel.Microservices
private void UpdateServiceListInfo()
{
- IEnumerable records;
- try
- {
- records = GetRecords();
- }
- catch (Exception ex)
- {
- Log.Error(ex, "[WebApiDiscoveryClient] Update service list error, discrovery service response is absent");
- return;
- }
- if (records == null)
- {
- Log.Warning("[WebApiDiscoveryClient] Update service list canceled, discrovery response is empty");
- return;
- }
- _lock.EnterWriteLock();
- try
+ _discoveryServerClient.ForceConnect();
+ if (_discoveryServerClient.Status == ZTransportStatus.Working)
{
- _tableByGroups.Clear();
- _tableByTypes.Clear();
- var keysToRemove = new List(_tableByKey.Keys);
- foreach (var info in records)
+ IEnumerable records = null;
+ try
{
- var key = info.ServiceKey.Trim().ToLowerInvariant();
- UpdateOrAddRecord(key, info);
- keysToRemove.Remove(key);
+ var ir = _discoveryServerClient.Request>("services", response => records = response);
+ if (!ir.Success)
+ {
+ Log.Warning($"[DiscoveryClient] UpdateServiceListInfo. Error request to inbox 'services'. {ir.Comment}");
+ return;
+ }
}
- RoundRobinCollection removed;
- foreach (var key in keysToRemove)
+ catch (Exception ex)
{
- _tableByKey.TryRemove(key, out removed);
- removed.Dispose();
+ Log.Error(ex, "[DiscoveryClient] UpdateServiceListInfo. Discrovery service response is absent");
+ return;
+ }
+ if (records == null)
+ {
+ Log.Warning("[DiscoveryClient] UpdateServiceListInfo. Discrovery response is empty");
+ return;
+ }
+ _lock.EnterWriteLock();
+ try
+ {
+ _tableByGroups.Clear();
+ _tableByTypes.Clear();
+ var keysToRemove = new List(_tableByKey.Keys);
+ foreach (var info in records)
+ {
+ var key = info.ServiceKey.Trim().ToLowerInvariant();
+ UpdateOrAddRecord(key, info);
+ keysToRemove.Remove(key);
+ }
+ foreach (var key in keysToRemove)
+ {
+ _tableByKey.TryRemove(key, out RoundRobinCollection removed);
+ removed.Dispose();
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex, "[DiscoveryClient] UpdateServiceListInfo. Update local routing table error.");
+ }
+ finally
+ {
+ _lock.ExitWriteLock();
}
}
- catch (Exception ex)
- {
- Log.Error(ex, "[WebApiDiscoveryClient] Update service list error");
- }
- finally
+ else
{
- _lock.ExitWriteLock();
+ Log.Warning("[DiscoveryClient] UpdateServiceListInfo. No connection to discovery server");
}
}
- public void Register(MicroserviceInfo info)
+ public bool Register(MicroserviceInfo info)
{
- try
+ _discoveryServerClient.ForceConnect();
+ if (_discoveryServerClient.Status == ZTransportStatus.Working)
{
- var result = Post(info);
- if (result.Success == false)
+ bool result = false;
+ try
{
- Log.Warning($"[WebApiDiscoveryClient] Service can't register. Discovery reason: {result.Comment}. Comment: {result.Comment}");
+ _discoveryServerClient.Request("register", info, r =>
+ {
+ result = r.Success;
+ if (!result)
+ {
+ Log.Warning($"[DiscoveryClient] Register canceled. Discovery reason: {r.Comment}. Comment: {r.Comment}");
+ }
+ });
}
+ catch (Exception ex)
+ {
+ Log.Error(ex, "[DiscoveryClient] Register fault");
+ }
+ return result;
}
- catch (Exception ex)
+ else
{
- Log.Error(ex, "[WebApiDiscoveryClient] Fault register");
+ Log.Warning("[DiscoveryClient] Register. No connection to discovery server");
+ return false;
}
}
diff --git a/ZeroLevel.Microservices/ExServiceHost.cs b/ZeroLevel/Services/Network/Microservices/ExServiceHost.cs
similarity index 98%
rename from ZeroLevel.Microservices/ExServiceHost.cs
rename to ZeroLevel/Services/Network/Microservices/ExServiceHost.cs
index fa8d5b6..7f631e7 100644
--- a/ZeroLevel.Microservices/ExServiceHost.cs
+++ b/ZeroLevel/Services/Network/Microservices/ExServiceHost.cs
@@ -4,19 +4,19 @@ using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
-using ZeroLevel.Microservices.Contracts;
+using ZeroLevel.Network;
using ZeroLevel.Network.Microservices;
using ZeroLevel.Services.Network;
namespace ZeroLevel.Microservices
{
- internal sealed class ExServiceHost
+ public sealed class ExServiceHost
: IDisposable
{
private class MetaService
{
public MicroserviceInfo ServiceInfo { get; set; }
- public ExService Server { get; set; }
+ public IExService Server { get; set; }
}
private bool _disposed = false;
@@ -26,13 +26,13 @@ namespace ZeroLevel.Microservices
private readonly ConcurrentDictionary _services
= new ConcurrentDictionary();
- internal ExServiceHost(IDiscoveryClient client)
+ public ExServiceHost(IDiscoveryClient client)
{
_discoveryClient = client;
_registerTaskKey = Sheduller.RemindEvery(TimeSpan.FromMilliseconds(50), TimeSpan.FromSeconds(15), RegisterServicesInDiscovery);
}
- internal IExService RegisterService(IExchangeService service)
+ public IExService RegisterService(IExchangeService service)
{
try
{
@@ -76,7 +76,7 @@ namespace ZeroLevel.Microservices
}
}
- internal IExService RegisterService(MicroserviceInfo serviceInfo)
+ public IExService RegisterService(MicroserviceInfo serviceInfo)
{
try
{
diff --git a/ZeroLevel.Microservices/Exchange.cs b/ZeroLevel/Services/Network/Microservices/Exchange.cs
similarity index 99%
rename from ZeroLevel.Microservices/Exchange.cs
rename to ZeroLevel/Services/Network/Microservices/Exchange.cs
index 5b4d4e7..d61d83d 100644
--- a/ZeroLevel.Microservices/Exchange.cs
+++ b/ZeroLevel/Services/Network/Microservices/Exchange.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using ZeroLevel.Microservices.Contracts;
+using ZeroLevel.Network;
using ZeroLevel.Network.Microservices;
using ZeroLevel.Services.Network;
diff --git a/ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs b/ZeroLevel/Services/Network/Microservices/IDiscoveryClient.cs
similarity index 83%
rename from ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs
rename to ZeroLevel/Services/Network/Microservices/IDiscoveryClient.cs
index 6bd1b3f..482dfd8 100644
--- a/ZeroLevel.Microservices/Contracts/IDiscoveryClient.cs
+++ b/ZeroLevel/Services/Network/Microservices/IDiscoveryClient.cs
@@ -1,11 +1,11 @@
using System.Collections.Generic;
using ZeroLevel.Network.Microservices;
-namespace ZeroLevel.Microservices.Contracts
+namespace ZeroLevel.Network
{
public interface IDiscoveryClient
{
- void Register(MicroserviceInfo info);
+ bool Register(MicroserviceInfo info);
IEnumerable GetServiceEndpoints(string serviceKey);
diff --git a/ZeroLevel.Microservices/Contracts/IExchangeService.cs b/ZeroLevel/Services/Network/Microservices/IExchangeService.cs
similarity index 84%
rename from ZeroLevel.Microservices/Contracts/IExchangeService.cs
rename to ZeroLevel/Services/Network/Microservices/IExchangeService.cs
index 67c4823..f54650c 100644
--- a/ZeroLevel.Microservices/Contracts/IExchangeService.cs
+++ b/ZeroLevel/Services/Network/Microservices/IExchangeService.cs
@@ -1,4 +1,4 @@
-namespace ZeroLevel.Microservices.Contracts
+namespace ZeroLevel.Network
{
public interface IExchangeService
{
diff --git a/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs b/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs
index c89c40b..3ad94fc 100644
--- a/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs
+++ b/ZeroLevel/Services/Network/Models/MicroserviceInfo.cs
@@ -1,12 +1,13 @@
using System;
using System.Runtime.Serialization;
+using ZeroLevel.Services.Serialization;
namespace ZeroLevel.Network.Microservices
{
[Serializable]
[DataContract]
public sealed class MicroserviceInfo :
- IEquatable
+ IEquatable, IBinarySerializable
{
public const string DEFAULT_GROUP_NAME = "__service_default_group__";
public const string DEFAULT_TYPE_NAME = "__service_default_type__";
@@ -73,6 +74,26 @@ namespace ZeroLevel.Network.Microservices
return this.ServiceKey.GetHashCode() ^ this.Protocol.GetHashCode() ^ this.Endpoint.GetHashCode();
}
+ public void Serialize(IBinaryWriter writer)
+ {
+ writer.WriteString(this.ServiceKey);
+ writer.WriteString(this.ServiceGroup);
+ writer.WriteString(this.ServiceType);
+ writer.WriteString(this.Protocol);
+ writer.WriteString(this.Endpoint);
+ writer.WriteString(this.Version);
+ }
+
+ public void Deserialize(IBinaryReader reader)
+ {
+ this.ServiceKey = reader.ReadString();
+ this.ServiceGroup = reader.ReadString();
+ this.ServiceType = reader.ReadString();
+ this.Protocol = reader.ReadString();
+ this.Endpoint = reader.ReadString();
+ this.Version = reader.ReadString();
+ }
+
public override string ToString()
{
return $"{ServiceKey} ({Version})";
diff --git a/ZeroLevel/Services/Network/Services/IPFinder.cs b/ZeroLevel/Services/Network/NetUtils.cs
similarity index 53%
rename from ZeroLevel/Services/Network/Services/IPFinder.cs
rename to ZeroLevel/Services/Network/NetUtils.cs
index e3c4be6..d554b82 100644
--- a/ZeroLevel/Services/Network/Services/IPFinder.cs
+++ b/ZeroLevel/Services/Network/NetUtils.cs
@@ -1,12 +1,48 @@
using System;
+using System.Globalization;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace ZeroLevel.Services.Network
{
- public static class IPFinder
+ public static class NetUtils
{
+ public static int Compare(this IPEndPoint x, IPEndPoint y)
+ {
+ var xx = x.Address.ToString();
+ var yy = y.Address.ToString();
+ var result = string.CompareOrdinal(xx, yy);
+ return result == 0 ? x.Port.CompareTo(y.Port) : result;
+ }
+
+ public static IPEndPoint CreateIPEndPoint(string endPoint)
+ {
+ string[] ep = endPoint.Split(':');
+ if (ep.Length < 2) throw new FormatException("Invalid endpoint format");
+ IPAddress ip;
+ if (ep.Length > 2)
+ {
+ if (!IPAddress.TryParse(string.Join(":", ep, 0, ep.Length - 1), out ip))
+ {
+ throw new FormatException("Invalid ip-adress");
+ }
+ }
+ else
+ {
+ if (!IPAddress.TryParse(ep[0], out ip))
+ {
+ throw new FormatException("Invalid ip-adress");
+ }
+ }
+ int port;
+ if (!int.TryParse(ep[ep.Length - 1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port))
+ {
+ throw new FormatException("Invalid port");
+ }
+ return new IPEndPoint(ip, port);
+ }
+
public static int GetFreeTcpPort()
{
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
diff --git a/ZeroLevel/Services/Network/Services/ExClient.cs b/ZeroLevel/Services/Network/Services/ExClient.cs
index ca61457..713af59 100644
--- a/ZeroLevel/Services/Network/Services/ExClient.cs
+++ b/ZeroLevel/Services/Network/Services/ExClient.cs
@@ -6,8 +6,8 @@ using ZeroLevel.Services.Network.Services;
namespace ZeroLevel.Services.Network
{
- public class ExClient
- : ZBaseNetwork, IExClient, IZBackward, IDisposable
+ internal sealed class ExClient
+ : ZBaseNetwork, IExClient, IZBackward
{
private readonly IZTransport _transport;
private readonly ExRouter _router;
diff --git a/ZeroLevel/Services/Network/Services/ExService.cs b/ZeroLevel/Services/Network/Services/ExService.cs
index d9a9857..b6bf69a 100644
--- a/ZeroLevel/Services/Network/Services/ExService.cs
+++ b/ZeroLevel/Services/Network/Services/ExService.cs
@@ -5,7 +5,7 @@ using ZeroLevel.Services.Network.Services;
namespace ZeroLevel.Services.Network
{
- public class ExService
+ internal sealed class ExService
: ZBaseNetwork, IExService
{
private readonly ExRouter _router;
diff --git a/ZeroLevel/Services/Network/Services/ZExSocketObservableServer.cs b/ZeroLevel/Services/Network/Services/ZExSocketObservableServer.cs
index 92d7fe2..11a2420 100644
--- a/ZeroLevel/Services/Network/Services/ZExSocketObservableServer.cs
+++ b/ZeroLevel/Services/Network/Services/ZExSocketObservableServer.cs
@@ -14,9 +14,9 @@ namespace ZeroLevel.Services.Network
public IPEndPoint Endpoint => base.LocalEndpoint;
- public event Action OnMessage = (f, c) => { };
+ public event Action OnMessage = (_, __) => { };
- public event Func OnRequest = (f, c) => null;
+ public event Func OnRequest = (_, __) => null;
protected override void Handle(Frame frame, IZBackward client)
{
diff --git a/ZeroLevel/Services/Network/SocketExtensions.cs b/ZeroLevel/Services/Network/SocketExtensions.cs
deleted file mode 100644
index 306aaaa..0000000
--- a/ZeroLevel/Services/Network/SocketExtensions.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-using System.Globalization;
-using System.Net;
-
-namespace ZeroLevel.Services.Network
-{
- public static class SocketExtensions
- {
- public static int Compare(this IPEndPoint x, IPEndPoint y)
- {
- var xx = x.Address.ToString();
- var yy = y.Address.ToString();
- var result = string.CompareOrdinal(xx, yy);
- return result == 0 ? x.Port.CompareTo(y.Port) : result;
- }
-
- public static IPEndPoint CreateIPEndPoint(string endPoint)
- {
- string[] ep = endPoint.Split(':');
- if (ep.Length < 2) throw new FormatException("Invalid endpoint format");
- IPAddress ip;
- if (ep.Length > 2)
- {
- if (!IPAddress.TryParse(string.Join(":", ep, 0, ep.Length - 1), out ip))
- {
- throw new FormatException("Invalid ip-adress");
- }
- }
- else
- {
- if (!IPAddress.TryParse(ep[0], out ip))
- {
- throw new FormatException("Invalid ip-adress");
- }
- }
- int port;
- if (!int.TryParse(ep[ep.Length - 1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port))
- {
- throw new FormatException("Invalid port");
- }
- return new IPEndPoint(ip, port);
- }
- }
-}
\ No newline at end of file
diff --git a/ZeroLevel/ZeroLevel.csproj b/ZeroLevel/ZeroLevel.csproj
index db88542..c1ee42e 100644
--- a/ZeroLevel/ZeroLevel.csproj
+++ b/ZeroLevel/ZeroLevel.csproj
@@ -238,6 +238,15 @@
+
+
+
+
+
+
+
+
+
@@ -251,11 +260,10 @@
-
+
-
diff --git a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache
index e77e86a..5d7709e 100644
--- a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache
+++ b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache
@@ -1 +1 @@
-7dc74ae62ea3925694bcfe614d7c1f201cc0d873
+34e7ecccf08c9607e57fb18cb5dd41e7bc1a3610
diff --git a/ZeroLevel/obj/Debug/ZeroLevel.csprojAssemblyReference.cache b/ZeroLevel/obj/Debug/ZeroLevel.csprojAssemblyReference.cache
index 55850f9..a0c6a03 100644
Binary files a/ZeroLevel/obj/Debug/ZeroLevel.csprojAssemblyReference.cache and b/ZeroLevel/obj/Debug/ZeroLevel.csprojAssemblyReference.cache differ