MIke 2 gadi atpakaļ
vecāks
revīzija
6df56cc782

+ 24 - 12
src/Process/ProcessStarter.cs

@@ -6,20 +6,20 @@ namespace WingCloudServer.Loader
 {
     public class ProcessStarter
     {
-        private ProcessStarter(){}
+        private ProcessStarter() { }
 
         /// <summary>
         /// 开始执行工具程序
         /// </summary>
         /// <param name="processName">工具程序名称</param>
-        public static void StartTool(string processName, string paramsValue="")
+        public static void StartTool(string processName, string paramsValue = "")
         {
-            var toolsRootPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Tools");           
+            var toolsRootPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Tools");
             var subPath = GetPlatfromTitle();
-            var tool = Path.Combine(toolsRootPath,subPath, $"{subPath}_{processName}");
+            var tool = Path.Combine(toolsRootPath, subPath, $"{subPath}_{processName}");
             if (Process.GetProcessesByName(Path.GetFileName(tool)).Length == 0)
-            {                                
-                using(Process process = new Process())
+            {
+                using (Process process = new Process())
                 {
                     process.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
                     process.StartInfo.FileName = tool;
@@ -29,6 +29,18 @@ namespace WingCloudServer.Loader
             }
         }
 
+        /// <summary>
+        /// 开始执行工具程序
+        /// </summary>
+        /// <param name="processName">工具程序名称</param>
+        public static void StartProcess(string path)
+        {
+            Process process = new Process();
+            process.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
+            process.StartInfo.FileName = path;
+            //process.StartInfo.Arguments = paramsValue;
+            process.Start();
+        }
         /// <summary>
         /// 停止工具程序
         /// </summary>
@@ -36,14 +48,14 @@ namespace WingCloudServer.Loader
         public static void StopTool(string processName)
         {
             var proc = Process.GetProcessesByName($"{GetPlatfromTitle()}_{processName}");
-            foreach(var p in proc)
+            foreach (var p in proc)
             {
                 try
                 {
                     Console.WriteLine($"close {p.ProcessName}");
                     Process.GetProcessById(p.Id).Kill();
                 }
-                catch(Exception pex)
+                catch (Exception pex)
                 {
                     Console.WriteLine($"{pex}");
                 }
@@ -53,17 +65,17 @@ namespace WingCloudServer.Loader
         private static string GetPlatfromTitle()
         {
             string platfrom;
-            switch(Environment.OSVersion.Platform)
+            switch (Environment.OSVersion.Platform)
             {
                 case PlatformID.Win32NT:
                     platfrom = "win";
-                break;
+                    break;
                 case PlatformID.MacOSX:
                     platfrom = "mac";
-                break;
+                    break;
                 default:
                     platfrom = "lin";
-                break;
+                    break;
             }
             return platfrom;
         }

+ 35 - 7
src/Program.cs

@@ -1,19 +1,28 @@
 using System;
-using System.IO;
+using System.Runtime.InteropServices;
+using System.Threading;
 
 namespace WingCloudServer
 {
     class Program
     {
+        private static WingApplicationBuilder wingApplication = null;
+        //委托
+        private delegate int ConsoleCtrlDelegate(int CtrlType);
+        //winApi
+        [DllImport("kernel32.dll")]
+        private static extern int SetConsoleCtrlHandler(ConsoleCtrlDelegate ctrlDelegate, int Add);
+        //volatile static 变量防止优化
+        volatile static ConsoleCtrlDelegate consoleCtrlDelegate = new ConsoleCtrlDelegate(HandlerRoutine);
         static void Main(string[] args)
-        {        
+        {
             try
             {
-                var wingApplicationBuilder = new WingApplicationBuilder(args);
-                var app = wingApplicationBuilder.Build();
-                app.Run();   
+                SetConsoleCtrlHandler(consoleCtrlDelegate, 1);
+                wingApplication = new WingApplicationBuilder(args);
+                wingApplication.Run();
             }
-            catch(Exception ex)
+            catch (Exception ex)
             {
                 Console.WriteLine($"Unhandled application exception:{ex}");
                 string readStr = Console.ReadLine();
@@ -21,7 +30,26 @@ namespace WingCloudServer
                 {
                     readStr = Console.ReadLine();
                 }
-            }                                                 
+            }
+        }
+
+        /// <summary>
+        /// 释放Service资源
+        /// </summary>
+        /// <param name="ctrlType"></param>
+        /// <returns></returns>
+        private static int HandlerRoutine(int ctrlType)
+        {
+            switch (ctrlType)
+            {
+                case 0:
+                    wingApplication?.Stop();
+                    break;
+                case 2:
+                    wingApplication?.Stop();
+                    break;
+            }
+            return 0;
         }
     }
 }

+ 23 - 0
src/Tools/WingStartTool/WingStartTool.deps.json

@@ -0,0 +1,23 @@
+{
+  "runtimeTarget": {
+    "name": ".NETCoreApp,Version=v3.1",
+    "signature": ""
+  },
+  "compilationOptions": {},
+  "targets": {
+    ".NETCoreApp,Version=v3.1": {
+      "WingStartTool/1.0.0": {
+        "runtime": {
+          "WingStartTool.dll": {}
+        }
+      }
+    }
+  },
+  "libraries": {
+    "WingStartTool/1.0.0": {
+      "type": "project",
+      "serviceable": false,
+      "sha512": ""
+    }
+  }
+}

BIN
src/Tools/WingStartTool/WingStartTool.dll


BIN
src/Tools/WingStartTool/WingStartTool.exe


+ 9 - 0
src/Tools/WingStartTool/WingStartTool.runtimeconfig.dev.json

@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "additionalProbingPaths": [
+      "C:\\Users\\vinno\\.dotnet\\store\\|arch|\\|tfm|",
+      "C:\\Users\\vinno\\.nuget\\packages",
+      "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+    ]
+  }
+}

+ 12 - 0
src/Tools/WingStartTool/WingStartTool.runtimeconfig.json

@@ -0,0 +1,12 @@
+{
+  "runtimeOptions": {
+    "tfm": "netcoreapp3.1",
+    "framework": {
+      "name": "Microsoft.NETCore.App",
+      "version": "3.1.0"
+    },
+    "configProperties": {
+      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false
+    }
+  }
+}

+ 14 - 2
src/WingApplication.cs

@@ -2,12 +2,14 @@ using System;
 using WingCloudServer.Log;
 using WingServerCommon.Config;
 using WingServerCommon.Log;
+using System.Runtime.InteropServices;
+using System.Threading;
 
 namespace WingCloudServer
 {
     internal class WingApplication
     {
-        private WingServer _server;
+        private  WingServer _server;
         public WingApplication()
         {
             InitilizeLogger();
@@ -53,7 +55,6 @@ namespace WingCloudServer
                 {
                     readStr = Console.ReadLine();
                 }
-                _server.Stop();
 
             }
             catch (Exception ex)
@@ -62,6 +63,17 @@ namespace WingCloudServer
             }
         }
 
+        internal void Stop()
+        {
+            try
+            {
+                _server.Stop();
+            }
+            catch (System.Exception ex)
+            {
+                throw ex;
+            }
+        }
         /// <summary>
         /// JsonRpcLite Log Writer implementation
         /// </summary>    

+ 36 - 11
src/WingApplicationBuilder.cs

@@ -16,17 +16,19 @@ using WingCloudServer.Loader;
 namespace WingCloudServer
 {
     internal class WingApplicationBuilder
-    {       
+    {
+        private WingApplication _app;
         public WingApplicationBuilder(string[] args)
-        {  
-            //TODO args ?  when to use                     
+        {
+            //TODO args ?  when to use   
+            _app = new WingApplication();
         }
 
         /// <summary>
         /// Start server to load all service
         /// </summary>
-        internal WingApplication Build()
-        {           
+        internal void Run()
+        {
             //=========================================================================//
             // TODO workaround fixed, we need  a better solution
             // AssemblyLoadContext.Default.Resolving += (a,b)=>{
@@ -36,12 +38,35 @@ namespace WingCloudServer
             // };
             //=========================================================================//         
 
-            //启动短信服务 //TODO Why we need sms tool in server ? or move to sms service ?
-            ProcessStarter.StartTool("Sms.Tool", ConfigurationManager.GetParammeter<StringParameter>("SMS","Host").Value); //Should be actived by deploy service in the future
-            Logger.WriteLineInfo($"Process Sms.Tool started!");    
+            //启动 工具
+            if (ConfigurationManager.GetParammeter<BoolParameter>("StartTool", "Enable").Value)
+            {
+                //TODO 跨平台
+                var startToolName = ConfigurationManager.GetParammeter<StringParameter>("StartTool", "StartToolName").Value;
+                if (string.IsNullOrEmpty(startToolName))
+                {
+                    startToolName = "startTool.bat";
+                }
+                var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, startToolName);
+                ProcessStarter.StartProcess(path);
+            }
+            _app.Run();
+        }
 
-            var app = new WingApplication();
-            return app;             
-        } 
+        internal void Stop()
+        {
+            _app?.Stop();
+             if (ConfigurationManager.GetParammeter<BoolParameter>("StartTool", "Enable").Value)
+            {
+                //TODO 跨平台
+                var startToolName = ConfigurationManager.GetParammeter<StringParameter>("StartTool", "ClosedToolName").Value;
+                if (string.IsNullOrEmpty(startToolName))
+                {
+                    startToolName = "closedTool.bat";
+                }
+                var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, startToolName);
+                ProcessStarter.StartProcess(path);
+            }
+        }
     }
 }

+ 9 - 0
src/WingCloudServer.csproj

@@ -63,5 +63,14 @@
       <Link>Networks\Carotid\%(Filename)%(Extension)</Link>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Update="startTool.bat">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+      <None Update="startMongoDB.bat">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Update="closedTool.bat">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 </Project>

+ 0 - 2
src/WingServer.cs

@@ -30,13 +30,11 @@ namespace WingCloudServer
             var jsonRpcHttpServerEngine = new JsonRpcHttpServerEngine(host);
             _rpcHttpServer.UseEngine(jsonRpcHttpServerEngine);
         }
-
         /// <summary>
         /// Start server to load all service
         /// </summary>
         internal void Start()
         {
-
             InitializeServices();
             _rpcInProcessServer.Start();
             _rpcHttpServer.Start();

+ 11 - 7
src/appsettings.json

@@ -18,11 +18,16 @@
     "Remote": ""
   },
   "SMS": {
-    "Host": "http://*:8302/",
     "CheckVerifyCodeApi": "http://127.0.0.1:8302/SmsTool/SendSms/CheckVerifyCode",
     "SendVerifyCodeApi": "http://127.0.0.1:8302/SmsTool/SendSms/SendVerifyCode",
     "SendMessageApi": "http://127.0.0.1:8302/SmsTool/SendSms/SendMessage"
   },
+  "Database": {
+    "Server": "127.0.0.1",
+    "Port": 8301,
+    "MaxConn": 100,
+    "DBName": "WingCloudDB"
+  },
   "Remedical": {
     "IsUploadThumbnail": true
   },
@@ -47,12 +52,6 @@
     "CFSServerUrl":"https://",
     "CDNServerUrl":"http://cdn-bj.fis.plus/"
   },
-  "Database": {
-    "Server": "127.0.0.1",
-    "Port": 8301,
-    "MaxConn": 100,
-    "DBName": "WingCloudDB"
-  },
   "Authentication": {
     "Admin" : 60,
     "User": 2880,
@@ -71,5 +70,10 @@
   },
   "User": {
     "HeartRateSeconds": 300
+  },
+  "StartTool":{
+    "Enable": true,
+    "StartToolName":"startTool.bat",
+    "ClosedToolName":"closedTool.bat"
   }
 }

+ 3 - 0
src/closedTool.bat

@@ -0,0 +1,3 @@
+@echo off
+taskkill /f /im  win_Sms.Tool.exe
+taskkill /f /im  win_mongod.exe

+ 3 - 0
src/startMongoDB.bat

@@ -0,0 +1,3 @@
+@echo off
+cd %~dp0Tools\WingStartTool
+start /b  WingStartTool.exe "%~dp0Tools "  "--dbpath  %~dp0Mongodb\Data  --logpath  %~dp0Mongodb\Logs\DBLog   --port 8301  --nojournal  --quiet "

+ 9 - 0
src/startTool.bat

@@ -0,0 +1,9 @@
+@echo off
+cd %~dp0Tools\win
+taskkill /f /im  win_Sms.Tool.exe
+start /b win_Sms.Tool.exe  "http://*:8302/"
+cd %~dp0Tools\WingStartTool
+
+ start /b  WingStartTool.exe "%~dp0Tools "  "--dbpath  %~dp0Mongodb\Data  --logpath  %~dp0Mongodb\Logs\DBLog   --port 8301  --nojournal  --quiet "
+ 
+