main
bicijinlian 10 months ago
parent 8fa3211b63
commit caeaad9e43

@ -57,7 +57,7 @@ $WebAppProcName ="HttpClientStudy.WebApp";
$WebAppProc = Get-Process $WebAppProcName -ErrorAction Ignore $WebAppProc = Get-Process $WebAppProcName -ErrorAction Ignore
if($null -eq $WebAppProc) if($null -eq $WebAppProc)
{ {
Write-Host "进程没有找到,可能已经" Write-Host "进程没有找到,可能已经退出"
} }
else { else {
$WebAppProc.Kill(); $WebAppProc.Kill();

@ -25,7 +25,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"metadata": { "metadata": {
"dotnet_interactive": { "dotnet_interactive": {
"language": "csharp" "language": "csharp"
@ -37,7 +37,40 @@
"languageId": "polyglot-notebook" "languageId": "polyglot-notebook"
} }
}, },
"outputs": [], "outputs": [
{
"data": {
"text/html": [
"<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>Microsoft.Extensions.DependencyInjection, 8.0.0</span></li><li><span>System.Net.Http.Json, 8.0.0</span></li></ul></div></div>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"启动WebApi项目\r\n"
]
},
{
"data": {
"text/plain": [
"C:\\Users\\ruyu\\.nuget\\packages\\microsoft.dotnet-interactive\\1.0.522904\\tools\\net8.0\\any\\Publish\\HttpClientStudy.WebApp\\HttpClientStudy.WebApp.dll"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"命令已在新窗口执行!\r\n"
]
}
],
"source": [ "source": [
"//全局设置,行运行一次,为后续准备\n", "//全局设置,行运行一次,为后续准备\n",
"#r \"nuget:System.Net.Http.Json\"\n", "#r \"nuget:System.Net.Http.Json\"\n",
@ -52,7 +85,10 @@
"\n", "\n",
"//启动已发布的WebApi项目\n", "//启动已发布的WebApi项目\n",
"Console.WriteLine(\"启动WebApi项目\");\n", "Console.WriteLine(\"启动WebApi项目\");\n",
"var startMessage = DotnetCommondUtility.ExecuteCommand(\"exec\",\"./Publish/HttpClientStudy.WebApp/HttpClientStudy.WebApp.dll\");\n", "var workDir = Environment.CurrentDirectory;\n",
"var fullPath = System.IO.Path.GetFullPath(\"./Publish/HttpClientStudy.WebApp/HttpClientStudy.WebApp.dll\",workDir);\n",
"fullPath.Display();\n",
"var startMessage = DotnetCommondUtility.ExecuteCommand(\"exec\",fullPath,true);\n",
"Console.WriteLine(startMessage);\n" "Console.WriteLine(startMessage);\n"
] ]
}, },

@ -56,10 +56,10 @@ namespace HttpClientStudy.Core.Utilities
{"Assembly.GetEntryAssembly().Location",("入口程序集的路径",Assembly.GetEntryAssembly()?.Location) }, {"Assembly.GetEntryAssembly().Location",("入口程序集的路径",Assembly.GetEntryAssembly()?.Location) },
//已过时当前程序集的CodeBase路径可能为file URI格式 //已过时当前程序集的CodeBase路径可能为file URI格式
{"Assembly.GetExecutingAssembly().CodeBase",("当前程序集的CodeBase路径",Assembly.GetExecutingAssembly()?.CodeBase) }, //{"Assembly.GetExecutingAssembly().CodeBase",("当前程序集的CodeBase路径",Assembly.GetExecutingAssembly()?.CodeBase) },
//已过时入口程序集的CodeBase路径可能为file URI格式 //已过时入口程序集的CodeBase路径可能为file URI格式
{"Assembly.GetEntryAssembly().CodeBase",("入口程序集的CodeBase路径",Assembly.GetEntryAssembly()?.CodeBase) }, //{"Assembly.GetEntryAssembly().CodeBase",("入口程序集的CodeBase路径",Assembly.GetEntryAssembly()?.CodeBase) },
}; };
return pathDic; return pathDic;

@ -1,49 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
namespace HttpClientStudy.Core.Utilities
{
/// <summary>
/// cmd命令行工具类
/// </summary>
public static class CmdUtility
{
/// <summary>
/// 执行cmd命令
/// </summary>
/// <param name="cmd"></param>
/// <returns>命令行输出结果</returns>
public static string RunCmd(string cmd)
{
string cmdResult = string.Empty;
// 创建一个新的ProcessStartInfo对象
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = $"/u /k start cmd.exe /u /k {cmd}",
//RedirectStandardOutput = true, // 重定向标准输出
//StandardOutputEncoding = Encoding.UTF8,
UseShellExecute = true, // 不使用系统外壳程序启动
CreateNoWindow = false // 不创建新窗口
};
// 启动进程
using (Process? process = Process.Start(startInfo))
{
if (process == null)
{
return "执行命令出错";
}
}
return cmdResult;
}
}
}

@ -16,24 +16,26 @@ namespace HttpClientStudy.Core.Utilities
/// 执行dotnet命令 /// 执行dotnet命令
/// </summary> /// </summary>
/// <param name="command">命令</param> /// <param name="command">命令</param>
/// <param name="arguments">命令参数</param> /// <param name="argument">命令参数</param>
/// <param name="waitForExit">是否等待退出</param> /// <param name="newWindow">新窗口执行命令</param>
/// <returns>命令行输出文本</returns> /// <returns>命令行输出文本</returns>
public static string ExecuteCommand(string command, string arguments = "", bool waitForExit=false) public static string ExecuteCommand(string command, string argument = "", bool newWindow = false)
{ {
string output = ""; string output = "";
try try
{
if (newWindow)
{ {
ProcessStartInfo startInfo = new ProcessStartInfo() ProcessStartInfo startInfo = new ProcessStartInfo()
{ {
FileName = "dotnet", FileName = "pwsh.exe",
Arguments = $"{command} {arguments}", Arguments = $" Start-Process -FilePath 'dotnet' {command} {argument}",
RedirectStandardOutput = true, //RedirectStandardOutput = true,
//StandardOutputEncoding = Encoding.UTF8, //StandardOutputEncoding = Encoding.UTF8,
RedirectStandardError = true, //RedirectStandardError = true,
//StandardErrorEncoding = Encoding.UTF8, //StandardErrorEncoding = Encoding.UTF8,
RedirectStandardInput = false, //RedirectStandardInput = false,
//StandardInputEncoding = Encoding.UTF8, //StandardInputEncoding = Encoding.UTF8,
UseShellExecute = false, UseShellExecute = false,
CreateNoWindow = false, CreateNoWindow = false,
@ -46,15 +48,49 @@ namespace HttpClientStudy.Core.Utilities
}; };
process.Start(); process.Start();
if (startInfo.RedirectStandardInput)
{ output = "命令已在新窗口执行!";
process.StandardInput.Write("");
} }
else
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "dotnet",
Arguments = $"{command} {argument}",
RedirectStandardOutput = true,
StandardOutputEncoding = Encoding.UTF8,
RedirectStandardError = true,
StandardErrorEncoding = Encoding.UTF8,
//RedirectStandardInput = false,
//StandardInputEncoding = Encoding.UTF8,
output = process.StandardOutput.ReadToEnd(); //启用内核模式时,不能重定向输出
UseShellExecute = false,
if (waitForExit) //不创建新窗口
CreateNoWindow = false,
};
Process process = new Process()
{
StartInfo = startInfo,
};
//处理输出
process.OutputDataReceived += (sender, args) =>
{ {
if (!string.IsNullOrEmpty(args.Data))
{
output += args.Data;
}
};
process.Start();
//开始异步读取输出
process.BeginOutputReadLine();
//等待里程结束
process.WaitForExit(); process.WaitForExit();
} }
} }
@ -66,7 +102,6 @@ namespace HttpClientStudy.Core.Utilities
return output; return output;
} }
/// <summary> /// <summary>
/// 新窗口启动WebApp项目 /// 新窗口启动WebApp项目
/// </summary> /// </summary>
@ -107,7 +142,7 @@ namespace HttpClientStudy.Core.Utilities
} }
/// <summary> /// <summary>
/// 启动新窗口,执行指定文件 /// 停止WebAPI项目
/// </summary> /// </summary>
/// <param name="startFile">包含全路径的可执行文件</param> /// <param name="startFile">包含全路径的可执行文件</param>
/// <returns></returns> /// <returns></returns>

@ -66,59 +66,6 @@ namespace HttpClientStudy.Core.Utilities
} }
public static void StartWebApiDll(string dllPath)
{
string projectAndMutexName = WebApiConfigManager.GetWebApiConfigOption().CurrentValue.WebAppMutexName;
string dllBasePath = Environment.CurrentDirectory;
Console.WriteLine($"根目录为:{dllBasePath}");
string dllFullPath = string.Empty;
if (Path.IsPathRooted(dllPath))
{
dllFullPath = dllPath;
}
else
{
dllPath = dllPath.TrimStart('.').TrimStart('\\', '/');
dllFullPath = Path.GetFullPath(Path.Combine(dllBasePath, dllPath));
}
//webapi项目不在运行状态则启动webapi项目
if (webAppIsRunningByMutex() == false)
{
Console.WriteLine($"启动程序为:{dllFullPath}");
//启动命令信息
var prossInfo = new System.Diagnostics.ProcessStartInfo("dotnet", $"{dllFullPath}")
{
UseShellExecute = true,
CreateNoWindow = false,
RedirectStandardOutput = false
};
//启动
System.Diagnostics.Process.Start(prossInfo);
}
//由互斥锁判断
bool webAppIsRunningByMutex()
{
bool createdResult = true;
//创建互斥锁
using (var mutex = new Mutex(true, projectAndMutexName, out createdResult))
{
if (createdResult)
{
mutex.ReleaseMutex();
}
}
//互斥锁是否创建成功
return !createdResult;
}
}
/// <summary> /// <summary>
/// 关闭webapi项目 /// 关闭webapi项目
/// </summary> /// </summary>

@ -20,33 +20,9 @@ namespace HttpClientStudy.UnitTest
} }
[Fact] [Fact]
public async Task TestAsync() public void Test()
{ {
var ips = await Dns.GetHostAddressesAsync("localhost");
string firstIp = ips?.FirstOrDefault()?.ToString() ?? string.Empty;
//自定义行为
var socketsHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromSeconds(1),
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(1),
MaxConnectionsPerServer = 10
};
var client = new HttpClient(socketsHandler);
for (var i = 0; i < 3; i++)
{
if (i > 0)
{
await Task.Delay(2000);
}
await client.GetAsync("http://localhost");
}
var queryNetwork = CmdUtility.RunCmd($"netstat -ano | findstr {firstIp}");
_output.WriteLine(queryNetwork);
} }
} }
} }

@ -17,7 +17,7 @@ namespace HttpClientStudy.UnitTest.UtilitiesTest
} }
[Fact] [Fact]
public void Test() public void ApplicationPaths_Test()
{ {
var dic = AppUtility.GetApplicationPaths(); var dic = AppUtility.GetApplicationPaths();

@ -1,29 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HttpClientStudy.Core.Utilities;
namespace HttpClientStudy.UnitTest.UtilitiesTest
{
public class CmdUtilityTest
{
private readonly ITestOutputHelper _output;
public CmdUtilityTest(ITestOutputHelper testOutput)
{
_output = testOutput;
}
[Fact]
public void Test()
{
string cmd = "tasklist";
var result = CmdUtility.RunCmd(cmd);
_output.WriteLine(result);
}
}
}

@ -35,26 +35,7 @@ namespace HttpClientStudy.UnitTest.UtilitiesTest
[Fact] [Fact]
public void Help_Test() public void Help_Test()
{ {
var result = DotnetCommondUtility.ExecuteCommand("", "--help"); var result = DotnetCommondUtility.ExecuteCommand("", "--help",true);
_output.WriteLine(result);
}
[Fact]
public void StartApp_Test()
{
var webapiDll = Path.GetFullPath("../../../../Docs/Publish/HttpClientStudy.WebApp/HttpClientStudy.WebApp.exe", Environment.CurrentDirectory);
var result = DotnetCommondUtility.RunWebApp(webapiDll,"--urls=http://localhost:8899");
_output.WriteLine(result);
}
[Fact]
public void StopApp_Test()
{
var result = DotnetCommondUtility.SopWebApp();
_output.WriteLine(result); _output.WriteLine(result);
} }

@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HttpClientStudy.Core.Utilities;
namespace HttpClientStudy.UnitTest.UtilitiesTest
{
public class StartupUtilityTest
{
private readonly ITestOutputHelper _output;
public StartupUtilityTest(ITestOutputHelper testOutput)
{
_output = testOutput;
}
[Fact]
public void StartWebApiDll_Test()
{
}
}
}
Loading…
Cancel
Save