ASP.NET Core 在 IIS 下的兩種部署模式

KestrelServer最大的優勢體現在它的跨平臺的能力,如果ASP.NET CORE應用只需要部署在Windows環境下,IIS也是不錯的選擇。ASP.NET CORE應用針對IIS具有兩種部署模式,它們都依賴于一個IIS針對ASP.NET CORE Core的擴展模塊。

一、ASP.NET CORE Core Module
二、 In-Process部署模式
三、Out-of-Process部署模式
四、<aspnetcore>配置

一、ASP.NET CORE Core Module

IIS其實也是按照管道的方式來處理請求的,但是IIS管道和ASP.NET CORE中間件管道有本質的不同。對于部署在IIS中的Web應用來說,從最初接收到請求到最終將響應發出去,這段處理流程被細分為一系列固定的步驟,每個都具有一個或者兩個(前置+后置)對應的事件或者回調。我們可以利用自定義的Module注冊相應的事件或回調在適當的時機接管請求,并按照自己希望的方式對它進行處理。

IIS提供了一系列原生(Native)的Module,我們也可以使用任意.NET語言編寫托管的Module,整合IIS和ASP.NET CORE 的這個ASP.NET CORE Core Module就是一個原生的Module。它利用注冊的事件將請求從IIS管道中攔截下來,并轉發給ASP.NET CORE管道進行處理。相應的安裝包可以從https://dotnet.microsoft.com/permalink/dotnetcore-current-windows-runtime-bundle-installer下載。

二、 In-Process部署模式

ASP.NET CORE在IIS下有In-Process和Out-of-Process兩種部署模式。In-Process模式下的ASP.NET CORE應用運行在IIS的工作進程w3wp.exe中(如果采用IIS Express,工作進程為iisexpress.exe)。如圖18-7所示,ASP.NET CORE應用在這種模式下使用的服務器類型是IISHttpServer,上述的ASP.NET CORE Core Module會將原始的請求轉發給這個服務器,并將后者生成響應轉交給IIS服務器進行回復。

5c2ad7657bcb93a48099eacebc7ae82d.png
圖1 In-Process部署模式

In-Process是默認采用的部署模式,所以我們不需要為此做任何設置,接下來我們就來演示一下具體的部署方式。我們在IIS的默認站點(Defaut Web Site)創建一個名為WebApp的應用,并將映射的物理路徑設置為“C:\App”。然后我們創建一個空的ASP.NET CORE程序,并編寫了如下這個將當前進程名稱作為響應內容的演示程序。

using?System.Diagnostics;
var?app?=?WebApplication.Create(args);
app.Run(context?=>?context.Response.WriteAsync(Process.GetCurrentProcess().ProcessName));
app.Run();

然后我們在Visual Studio的解決方案視圖右鍵選擇該項目,在彈出的菜單中選擇“發布(Publish)”選項,創建一個指向“C:\App”的Publish Profile,然后執行這個Profile完成發布工作。應用發布也可以執行命令行“dotnet publish”來完成。應用部署好之后,我們利用瀏覽器采用地址“http://localhost/webapp”訪問部署好的應用,從圖2所示的輸出結果可以看出ASP.NET CORE應用實際上就運行在IIS的工作進程中。

73ae66e0c447343a0db13d75ea158f71.jpeg

圖2 In-Process模式下的進程名稱

如果我查看此時的部署目錄(“C:\App”),會發現生成的程序集和配置文件。應用既然部署在IIS中,那么具體的配置自然定義在web.config中,如下所示的就是這個文件的內容。我們會發現所有的請求(path="*" verb="*")都被映射到“AspNetCoreModuleV2”這個Module上,這就是上面介紹的ASP.NET CORE Core Module。至于這個Module如果啟動ASP.NET CORE管道并與之交互,則由后面的<aspNetCore>配置節來控制,可以看到它將表示部署模式的hostingModel屬性設置為“inprocess”。

<?xml?version="1.0"?encoding="utf-8"?>
<configuration><location?path="."?inheritInChildApplications="false"><system.webServer><handlers><add?name="aspNetCore"??path="*"??verb="*"??modules="AspNetCoreModuleV2"??resourceType="Unspecified"?/></handlers><aspNetCore??processPath="dotnet"??arguments=".\App.dll"??stdoutLogEnabled="false"??stdoutLogFile=".\logs\stdout"??hostingModel="inprocess"?/></system.webServer></location>
</configuration>
<!--ProjectGuid:?243DF55D-2E11-481F-AA7A-141C2A75792D-->

In-Process模式會注冊如下這個IISHttpServer,對應的配置選項定義在IISServerOptions中。如果具有同步讀寫請求和響應主體內容的需要,我們需要將AllowSynchronousIO屬性(默認為False)設置為True。如果將AutomaticAuthentication屬性返回True(默認值),認證用戶將自動賦值給HttpContext上下文的User屬性。我們可以利用MaxRequestBodyBufferSize(默認為1,048,576)和MaxRequestBodySize屬性(默認為30,000,000)設置接收請求主體的緩沖區的容量,和最大請求主體的字節數。

internal?class?IISHttpServer?:?IServer,?IDisposable
{public?IFeatureCollection?Features?{?get;?}public?IISHttpServer(IISNativeApplication?nativeApplication,?IHostApplicationLifetime?applicationLifetime,IAuthenticationSchemeProvider?authentication,?IOptions<IISServerOptions>?options,?ILogger<IISHttpServer>?logger);public?unsafe?Task?StartAsync<TContext>(IHttpApplication<TContext>?application,?CancellationToken?cancellationToken);public?Task?StopAsync(CancellationToken?cancellationToken);
}
public?class?IISServerOptions
{public?bool?AllowSynchronousIO?{?get;?set;?}public?bool?AutomaticAuthentication?{?get;?set;?}public?string??AuthenticationDisplayName?{?get;?set;?}public?int?MaxRequestBodyBufferSize?{?get;?set;?}public?long??MaxRequestBodySize?{?get;?set;?}
}

針對IISHttpServer的注冊實現在IWebHostBuilder接口如下這個UseIIS擴展方法中。由于這個方法并沒有提供一個Action<IISServerOptions>委托參數對IISServerOptions配置選項進行設置,所以我們不得不采用原始的對它進行設置。由于IHostBuider接口ConfigureWebHostDefaults擴展方法內部會調用這個方法, 我們并不需要為此做額外的工作。

public?static?class?WebHostBuilderIISExtensions
{public?static?IWebHostBuilder?UseIIS(this?IWebHostBuilder?hostBuilder);
}

三、Out-of-Process部署模式

ASP.NET CORE應用在IIS中還可以采用Out-of -Process模式進行部署。如圖3所示,在這種部署下,采用KestrelServer的ASP.NET CORE應用運行在獨立的dotnet.exe進程中。當IIS接受到針對目標應用的請求時,如果目標應用所在的進程并未啟動,ASP.NET CORE Core Module還負責執行dotnet命令激活此進程,相當于充當了WAS(Windows Activation Service)的作用。

104ae71a791f9c8c0694e23908af5976.png
圖3 Out-of-Process部署模式

在激活ASP.NET CORE承載進程之前,ASP.NET CORE Core Module會選擇一個可用的端口號,該端口號和當前應用的路徑(該路徑將作用ASP.NET CORE應用的PathBase)被寫入環境變量,對應的環境變量名稱分別為“ASPNETCORE_PORT”和“ASPNETCORE_APPL_PATH”。以Out-of-Process模式部署的ASP.NET CORE應用只會接收IIS轉發給它的請求,為了能夠過濾其它來源的請求,ASP.NET CORE Core Module會生成一個Token并寫入環境變量“ASPNETCORE_TOKEN”。后續轉發的請求會利用一個報頭“MS-ASPNETCORE-TOKEN”傳遞此Token,ASP.NET CORE應用會校驗是否與之前生成的Token匹配。

ASP.NET CORE Core Module還會利用環境變量傳遞其他一些設置,認證方案會寫入環境變量“ASPNETCORE_IIS_HTTPAUTH”,另一個“ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED”環境變量用來設置針對Web Socket的支持狀態。由于這些環境變量名稱的前綴都是“ASPNETCORE_”,所以它們會作為默認配置源。KestrelServer最終會綁定到基于該端口的本地終結點(“localhost”)進行監聽。由于監聽地址是由ASP.NET CORE Core Module控制的,所以它只需要將請求往該地址進行轉發,最終將接收到響應交給IIS返回即可。由于這里涉及本地回環網絡(Loopback)的訪問,其性能自然不如In-Process部署模式。

<?xml?version="1.0"?encoding="utf-8"?>
<configuration><location?path="."?inheritInChildApplications="false"><system.webServer><handlers><add?name="aspNetCore"??path="*"??verb="*"??modules="AspNetCoreModuleV2"??resourceType="Unspecified"?/></handlers><aspNetCore??processPath="dotnet"??arguments=".\App.dll"??stdoutLogEnabled="false"??stdoutLogFile=".\logs\stdout"??hostingModel="outofprocess"?/></system.webServer></location>
</configuration>
<!--ProjectGuid:?243DF55D-2E11-481F-AA7A-141C2A75792D-->

我們在上面演示了In-Process的部署方式,現在我們直接修改配置文件web.config,按照上面的方式將<aspNetCore>配置節的hostingModel屬性設置為“outofprocess”,部署的應用就自動切換到Out-of-Process。此時再次以相同的方式訪問部署的應用,我們會發現瀏覽器上顯示的進程名稱變成了“dotnet”。

d1019a3abee491d9648cf0fe7b1fcc6b.jpeg

圖4 Out-of-Process模式下的進程名稱

部署模式可以直接定義在項目文件中,如果按照如下的方式將AspNetCoreHostingModel屬性設置為“OutOfProcess”,那么發布后生成的web.config中針對部署模式的設置將隨之改變。該屬性默認值為“InProcess”,我們也可以顯式進行設置。

<Project?Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net6.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile><AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel></PropertyGroup>
</Project>

為了進一步驗證上述的這一系列環境變量是否存在,如下所示的演示程序會將以“ASPNETCORE_”為前綴的環境變量作為響應內容輸出來。除此之外,作為響應輸出的還有進程名稱、請求的PathBase和“MS-ASPNETCORE-TOKEN”報頭。

using?System.Diagnostics;
using?System.Text;var?app?=?WebApplication.Create(args);
app.Run(HandleAsync);
app.Run();Task?HandleAsync(HttpContext?httpContext)
{var?request?=?httpContext.Request;var?configuration?=?httpContext.RequestServices.GetRequiredService<IConfiguration>();var?builder?=?new?StringBuilder();builder.AppendLine($"Process:?{Process.GetCurrentProcess().ProcessName}");builder.AppendLine($"MS-ASPNETCORE-TOKEN:?{request.Headers["MS-ASPNETCORE-TOKEN"]}");builder.AppendLine($"PathBase:?{request.PathBase}");builder.AppendLine("Environment?Variables");foreach?(string?key?in?Environment.GetEnvironmentVariables().Keys){if?(key.StartsWith("ASPNETCORE_")){builder.AppendLine($"\t{key}={Environment.GetEnvironmentVariable(key)}");}}return?httpContext.Response.WriteAsync(builder.ToString());
}

應用重新發布之后,再次利用瀏覽器訪問后回得到如圖5所示的結果。我們可以從這里找到上述的環境變量,請求攜帶的“MS-ASPNETCORE-TOKEN”報頭正好與對應環境變量的值一致,應用在IIS中的虛擬目錄作為了應用路徑被寫入環境變量并成為請求的PathBase。如果站點提供了HTTPS終結點,其端口還會寫入“ASPNETCORE_ANCM_HTTPS_PORT”這個環境變量,這是為了實現針對HTTPS終結點的重定向而設計的。

805d309a8bb038e88c8f76a1cff5bf3e.png
圖5 Out-of-Process模式下環境變量

Out-of-Process部署的大部分實現都是由如下這個IISMiddleware中間件來完成的,IISOptions為對應的配置選項。IISMiddleware中間件完成了針對“配對Token”的驗證過濾非IIS轉發的請求。如果IISOptions配置選項的ForwardClientCertificate屬性返回True(默認值),此中間件會從請求報頭“MS-ASPNETCORE-CLIENTCERT”中提取客戶端證書,并將它保存到ITlsConnectionFeature特性中。該中間件還會將當前Windows賬號對應的WindowsPrincipal對象附加到HttpContext上下文的特性集合中,如果IISOptions配置選項的AutomaticAuthentication屬性返回True(默認值),該對象會直接賦值給HttpContext上下文的User屬性。

public?class?IISMiddleware
{public?IISMiddleware(RequestDelegate?next,?ILoggerFactory?loggerFactory,?IOptions<IISOptions>?options,?string?pairingToken,?IAuthenticationSchemeProvider?authentication,?IHostApplicationLifetime?applicationLifetime);public?IISMiddleware(RequestDelegate?next,?ILoggerFactory?loggerFactory,?IOptions<IISOptions>?options,?string?pairingToken,?bool?isWebsocketsSupported,?IAuthenticationSchemeProvider?authentication,?IHostApplicationLifetime?applicationLifetime);public?Task?Invoke(HttpContext?httpContext);public?Task?Invoke(HttpContext?httpContext)
}
public?class?IISOptions
{public?bool?AutomaticAuthentication?{?get;?set;?}public?string??AuthenticationDisplayName?{?get;?set;?}public?bool?ForwardClientCertificate?{?get;?set;?}
}

IIS利用WAS根據請求激活工作進程w3wp.exe。如果站點長時間未曾訪問,它還會自動關閉工作進程。如果工作進程都關閉了,承載ASP.NET CORE應用的dotnet.exe進程自然也應該關閉。為了關閉應用承載進程,ASP.NET CORE Core Module會發送一個特殊的請求,該請求攜帶一個值為“shutdown”的“MS-ASPNETCORE-EVENT”報頭,IISMiddleware中間件在接收到該請求時會利用注入的IHostApplicationLifetime對象關閉當前應用。如果不支持WebSocket,該中間件還會將代表“可升級到雙向通信”的IHttpUpgradeFeature特性刪除。將應用路徑設置為請求的PathBase也是由這個中間件完成的。由于IISMiddleware中間件所作的實際上是對HttpContext上下文進行初始化的工作,所以它必須優先執行才有意義,為了將此中間件置于管道的前端,如下這個IISSetupFilter被定義出來完成對該中間件的注冊。

internal?class?IISSetupFilter?:?IStartupFilter
{internal?IISSetupFilter(string?pairingToken,?PathString?pathBase,?bool?isWebsocketsSupported);public?Action<IApplicationBuilder>?Configure(Action<IApplicationBuilder>?next);
}

IISSetupFilter最終是通過IWebHostBuilder接口如下這個UseIISIntegration擴展方法進行注冊的。這個方法還負責從當前配置和環境變量提取端口號,并完成監聽地址的注冊。由于KestrelServer默認會選擇注冊到服務器上的終結點,所以該方法會利用配置將IServerAddressesFeature特性的PreferHostingUrls屬性設置為True,這里設置的監聽地址才會生效。這個方法還會根據當前IIS站點的設置對IISOptions作相應設置。由于IHostBuider接口ConfigureWebHostDefaults擴展方法內部也會調用這個方法,我們并不需要為此做額外的工作。

public?static?class?WebHostBuilderIISExtensions
{public?static?IWebHostBuilder?UseIISIntegration(this?IWebHostBuilder?hostBuilder);
}

四、<aspnetcore>配置

不論是采用何種部署模式,相關的配置都定義在部署目錄下的web.config配置文件,它提供的針對ASP.NET CORE Core Module的映射使我們能夠將ASP.NET CORE應用部署在IIS中。在web.config中,與ASP.NET CORE應用部署相關的配置定義在<aspNetCore>配置節中。

<aspNetCoreprocessPath?=?"dotnet"arguments?=?".\App.dll"stdoutLogEnabled?=?"false"stdoutLogFile?=?".\logs\stdout"hostingModel?=?"outofprocess"forwardWindowsAuthToken????=?"true"processesPerApplication????=?"10"rapidFailsPerMinute????=?"5"requestTimeout?=?"00:02:00"shutdownTimeLimit?=?"60"startupRetryCount?=?"3"startupTimeLimit?=?"60"><environmentVariables><environmentVariable?name?=?"ASPNETCORE_ENVIRONMENT"?value?=?"Development"/></environmentVariables><handlerSettings><handlerSetting?name?=?"stackSize"?value?=?"2097152"?/><handlerSetting?name?=?"debugFile"?value?=?".\logs\aspnetcore-debug.log"?/><handlerSetting?name?=?"debugLevel"?value?=?"FILE,TRACE"?/></handlerSettings>
</aspNetCore>
上面這段XML片段包含了完整的<aspNetCore>配置屬性,下表對這些配置進行了簡單的說明。設置的文件可以采用絕對路徑和相對于部署目錄(通過 “.”表示)的相對路徑。

屬性

含  義

processPath

ASP.NET CORE應用啟動命令所在路徑,必需。

arguments

ASP.NET CORE應用啟動傳入的參數,可選。

stdoutLogEnabled

是否將stdout 和stderr輸出到 stdoutLogFile屬性指定的文件,默認為False。

stdoutLogFile

作為stdout 和stderr輸出的日志文件,默認為“ aspnetcore-stdout”。

hostingModel

部署模式,“inprocess/InProcess”或者“outofprocess/OutOfProcess”(默認值)。

forwardWindowsAuthToken

是否轉發Windows認證令牌,默認為True。

processesPerApplication

承載ASP.NET CORE應用的進程( processPath)數,默認為1。該配置對In-Process模式無效。

rapidFailsPerMinute

ASP.NET CORE應用承載進程( processPath)每分鐘允許崩潰的次數,默認為10,超過此數量將不再試圖重新啟動它。

requestTimeout

請求處理超時時間,默認為2分鐘。

startupRetryCount

ASP.NET CORE應用承載進程啟動重試次數,默認為2次。

startupTimeLimit

ASP.NET CORE應用承載進程啟動超時時間(單位為秒),默認為120秒。

environmentVariables

設置環境變量。

handlerSettings

為ASP.NET CORE Core Module提供額外的配置。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

navicat連接遠程mysql

環境介紹: 這里,我連接的是阿里云的服務器,自己搭的環境,用的是mysql 5.7一 首先第一步,需要進入遠程服務器的mysql,更改host訪問權限 然后,將root允許訪問的host 改為%(任何ip地址都可以訪問) 注: 原來是只允許本地訪問二 本地用navicat連接遠程mysql 1. 常規部分填寫2. SSH部…

2018-08-15期 HBase命令行使用案例

1、進入hbase命令行[roothadoop-server01 bin]# hbase shell2、命令行幫助COMMAND GROUPS:Group name: generalCommands: status, table_help, version, whoamiGroup name: ddlCommands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, dro…

面向對象五大設計原則

最近在看七牛云許式偉的架構課, 重溫了面向對象五大設計原則(SOLID)&#xff0c;扣理論文字找出處。&#xff08;當然許老板是不可能深聊這么低級的內容&#xff0c;&#x1f921;&#xff09;注意區分設計原則和設計模式。設計原則更為抽象和泛化&#xff1b;設計模式也是抽象…

python函數式編程-匿名函數

>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81] 關鍵字lambda表示匿名函數&#xff0c;冒號前面的x表示函數參數。 匿名函數有個限制&#xff0c;就是只能有一個表達式&#xff0c;不用寫return&#xff0c;返回值就是該表…

bean初始化、注銷

關于在spring 容器初始化 bean 和銷毀前所做的操作定義方式有三種&#xff1a; 第一種&#xff1a;通過PostConstruct 和 PreDestroy 方法 實現初始化和銷毀bean之前進行的操作 第二種是&#xff1a;通過 在xml中定義init-method 和 destory-method方法 第三種是&#xff1a;…

谷歌F12調試公眾號時,讓鼠標顯示出來

yi 環境介紹: win10 , 谷歌瀏覽器yii 概述: 在項目中,需要調試公眾號,本地環境搭好之后,在谷歌瀏覽時,發現移動到公眾號區域,鼠標居然不見了,這讓我怎么操作?各種操作可謂是日了狗了,非常麻煩yiii 調試時鼠標不見的解決辦法: 網上各種說法眾說紛紜,這里,我給出本人認為最恰當簡…

利用bootstrap插件設置時間

$("#"id_rand" .shijian-input").each(function () { $(this).datetimepicker({ lang:"ch", //語言選擇中文 注&#xff1a;舊版本 新版方法&#xff1a;$.datetimepicker.setLocale(ch); format: "hh : ii", /…

C# 編寫的 64位操作系統 -MOOS

MOOSMOOS ( My Own Operating System )是一個使用.NET Native AOT技術編譯的C# 64位操作系統。項目地址&#xff1a;https://github.com/nifanfa/MOOS編譯關于編譯MOOS的信息&#xff0c;請閱讀 編譯維基頁面&#xff1a;https://github.com/nifanfa/MOOS/wiki/。編譯要求VMwar…

js獲取屏幕寬高和下拉加載更多

document.body.clientWidth > BODY對象寬度 document.body.clientHeight > BODY對象高度 document.documentElement.clientWidth > 可見區域寬度 document.documentElement.clientHeight > 可見區域高度 網頁可見區域寬&#xff1a; document.body.clientWid…

X5開發中buttongrounp對應contents組件切換時速度快點無效

官方提供的解決辦法是&#xff1a;http://docs.wex5.com/wex5-ui-question-list-2084/ 原文如下&#xff1a;【問題】buttongrounp中的button按鈕全是代碼動態生成&#xff0c;對應的contents中的content也是代碼動態生成。發現在快讀點擊button的時候&#xff0c;content就會死…

JAVA語言基礎-面向對象(IO:IO字符流、遞歸)

2019獨角獸企業重金招聘Python工程師標準>>> 21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接讀寫字符的IO流字符流讀取字符, 就要先讀取到字節數據, 然后轉為字符. 如果要寫出字符, 需要把字符轉為字節再寫出.2.FileReader FileReader類的read()方法…

windows下, nginx 提示錯誤 No input file specified

一 環境介紹: win10, LNMP 二 錯誤描述: 訪問網站時,提示"No input file specified"錯誤. 排錯階段: 1. 查看nginx access日志 (access.log) 發現提示404 錯誤 2. 分析原因: 這時,在同目錄下創建一個txt文件,訪問就可以正常輸出了 這說明 現在nginx 訪問php 沒…

Ubuntu20.04+docker+jenkins+飛書實現自動化發布

一、從0-1一點一滴實現如何本地提交代碼到gitlab然后實現前后端自動發布1.更新apt包索引sudo apt-get update2.安裝必備的軟件包以允許apt通過https使用存儲庫sudo apt-get install ca-certificates curl gnupg lsb-release3.添加Docker官方版本的GPG密鑰sudo mkdir -p /etc/ap…

一個Demo讓你掌握Android所有控件

一個Demo讓你掌握Android所有控件 原文:一個Demo讓你掌握Android所有控件本文是轉載收藏,侵刪,出處:"安卓巴士" 下面給出實現各個組件的源代碼&#xff1a; 1.下拉框實現--Spinner [java] view plaincopyprint?package com.cellcom; import java.util.ArrayList;…

九妹帶你走向 架構師

邁向系統架構師編者按&#xff1a;系統架構師是許多程序員的夢想職業。今天的你也許已經掌握了各種開發工具&#xff0c;并且能夠使用各種平臺進行開發&#xff0c;但作為一個架構師的要求&#xff0c;也許還有很長的道路。邢波濤先生在LAMP架構上的造詣&#xff0c;讓我邀請他…

WPF 使用 DrawingContext 繪制溫度計

WPF 使用 DrawingContext 繪制溫度計控件名&#xff1a;Thermometer作者&#xff1a; WPFDevelopersOrg原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40&#xff1b;Visual Studio 2022;項目使用 MIT 開源許可協議&#xff…

MAVEN簡介之——settings.xml

概述 Maven的settings.xml配置了Maven執行的方式&#xff0c;像pom.xml一樣&#xff0c;但是它是一個通用的配置&#xff0c;不能綁定到任何特殊的項目。它通常包括本地倉庫地址&#xff0c;遠程倉庫服務&#xff0c;認證信息等。 settings.xml存在于兩個位置&#xff1a; mave…

裝win10系統

一、使用U盤介質安裝win10系統&#xff08;官方方式&#xff09; 官方安裝工具下載地址&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10 1、進入官方安裝工具下載頁面&#xff0c;點擊立即下載工具&#xff0c;下載安裝工具。2、下載完成后&#xff…

C#構造函數、操作符重載以及自定義類型轉換

構造器 構造器&#xff08;構造函數&#xff09;是將類型的實例初始化的特殊方法。構造器可分為實例構造器和類型構造器&#xff0c;本節將詳細介紹有關內容。 實例構造器 顧名思義&#xff0c;實例構造器的作用就是對類型的實例進行初始化。如果類沒有顯示定義任何構造器&…

「Dotnet 工具箱」 自動生成并綁定 Https 證書

這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘記關注。介紹LettuceEncrypt 是一個使用 C# 開發的免費的工具&#xff0c;它和證書頒發機構 &#xff08;CA&#xff09;集成&#xff0c;比如 Lets Encrypt&#xff0c;它使用了…