|
|
@ -21,7 +21,41 @@
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"## 准备工作:先执行下面单元,以启动WebApi及设置全局对象、方法及其它"
|
|
|
|
"## 0、准备工作:先执行下面单元,以启动WebApi及设置全局对象、方法及其它"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"## 启动WebApi"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
|
|
"execution_count": 18,
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"dotnet_interactive": {
|
|
|
|
|
|
|
|
"language": "pwsh"
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"polyglot_notebook": {
|
|
|
|
|
|
|
|
"kernelName": "pwsh"
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"outputs": [],
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"#启动已发布的WebApi项目\n",
|
|
|
|
|
|
|
|
"Start-Process -FilePath \"dotnet.exe\" -ArgumentList \"Publish/HttpClientStudy.WebApi/HttpClientStudy.WebApi.dll\""
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"## 关闭WebApi"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -29,10 +63,10 @@
|
|
|
|
"execution_count": null,
|
|
|
|
"execution_count": null,
|
|
|
|
"metadata": {
|
|
|
|
"metadata": {
|
|
|
|
"dotnet_interactive": {
|
|
|
|
"dotnet_interactive": {
|
|
|
|
"language": "csharp"
|
|
|
|
"language": "pwsh"
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"polyglot_notebook": {
|
|
|
|
"kernelName": "csharp"
|
|
|
|
"kernelName": "pwsh"
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"vscode": {
|
|
|
|
"vscode": {
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
@ -40,20 +74,17 @@
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"outputs": [],
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"source": [
|
|
|
|
"//Nuget包\n",
|
|
|
|
"# 关闭项目进程\n",
|
|
|
|
"\n",
|
|
|
|
"$WebAppProcName =\"HttpClientStudy.WebApp\";\n",
|
|
|
|
"//全局引用\n",
|
|
|
|
"$WebAppProc = Get-Process $WebAppProcName -ErrorAction Ignore\n",
|
|
|
|
"#r \"./Publish/HttpClientStudy.Core/HttpClientStudy.Core.dll\"\n",
|
|
|
|
"if($null -eq $WebAppProc)\n",
|
|
|
|
"\n",
|
|
|
|
"{\n",
|
|
|
|
"//全局对象\n",
|
|
|
|
" Write-Host \"进程没有找到,可能已经\"\n",
|
|
|
|
"global using System.IO;\n",
|
|
|
|
"}\n",
|
|
|
|
"global using HttpClientStudy.Core;\n",
|
|
|
|
"else {\n",
|
|
|
|
"global using HttpClientStudy.Core.Utilities;\n",
|
|
|
|
" $WebAppProc.Kill();\n",
|
|
|
|
"\n",
|
|
|
|
" Write-Host \"$WebAppProcName 进程已退出\"\n",
|
|
|
|
"string dllFile = Path.GetFullPath(\"Publish\\\\HttpClientStudy.WebApp\\\\HttpClientStudy.WebApp.dll\",Directory.GetCurrentDirectory());\n",
|
|
|
|
"}"
|
|
|
|
"Console.WriteLine($\"指定的文件为:{dllFile}\");\n",
|
|
|
|
|
|
|
|
"//启动WebAPI项目\n",
|
|
|
|
|
|
|
|
"StartupUtility.StartWebApiDll(dllFile);"
|
|
|
|
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -404,6 +435,56 @@
|
|
|
|
"### 测试最大连接数"
|
|
|
|
"### 测试最大连接数"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
|
|
"execution_count": null,
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"outputs": [],
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"using System.Net;\n",
|
|
|
|
|
|
|
|
"var ips = await Dns.GetHostAddressesAsync(\"www.google.com\");\n",
|
|
|
|
|
|
|
|
"\t\n",
|
|
|
|
|
|
|
|
"foreach (var ipAddress in ips)\n",
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
|
|
|
|
"\t Console.WriteLine(ipAddress.MapToIPv4().ToString());\n",
|
|
|
|
|
|
|
|
"}\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"var socketsHandler = new SocketsHttpHandler\n",
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
|
|
|
|
"\tPooledConnectionLifetime = TimeSpan.FromSeconds(60),\n",
|
|
|
|
|
|
|
|
"\tPooledConnectionIdleTimeout = TimeSpan.FromMinutes(20),\n",
|
|
|
|
|
|
|
|
"\tMaxConnectionsPerServer = 2\n",
|
|
|
|
|
|
|
|
"};\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"var client = new HttpClient(socketsHandler);\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"var sw = Stopwatch.StartNew();\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"var tasks = Enumerable.Range(0, 200).Select(i => client.GetAsync(\"https://www.google.com\"));\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"await Task.WhenAll(tasks);\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
"sw.Stop();\n",
|
|
|
|
|
|
|
|
"\t\n",
|
|
|
|
|
|
|
|
"Console.WriteLine($\"{sw.ElapsedMilliseconds}ms taken for 200 requests\");\n",
|
|
|
|
|
|
|
|
"\t\n",
|
|
|
|
|
|
|
|
"//执行查看网络状态方法"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"该代码将MaxConnectionsPerServer限制为2。然后启动200个任务,每个任务都向同一端点发出HTTP请求。这些任务将同时运行。所有请求竞争所花费的时间将写入控制台。\n",
|
|
|
|
|
|
|
|
"如果使用netstat查看连接,则根据定义的限制,我们可以看到两个已建立的连接。\n",
|
|
|
|
|
|
|
|
"已建立\n"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|