[英]ASP.NET Core 6.0+: How to get the current (case-sensitive) IIS Website Name?
我正在嘗試獲取托管在 IIS 中的 ASP.NET 6 應用程序的名稱。我需要的正是這個帶有適當大小寫的名稱:
在 .NET Framework 4.8 中,此名稱由HttpRequest.ApplicationPath提供,並以適當的大小寫返回(如 IIS 中的配置,而不是在即將到來的請求的 URL 中)。 但是,它在 .NET 6 中不存在。
我試過了:
HttpContext.Request.PathBase
,但它返回的路徑與請求 URL 中的路徑完全相同,而不是 IIS 中的路徑IServerAddressesFeature
和IWebHostEnvironment
,但它們都不包含來自 IIS 的名稱以及正確的大小寫IServerAddressesFeature
,但也沒有在此處找到任何相關內容IServerVariablesFeature serverVars = HttpContext.Features.Get<IServerVariablesFeature>()
然后是 IIS 站點名稱: string iis_version = serverVars["INSTANCE_NAME"]
(參見此處的文檔),但它以大寫字母返回應用程序名稱( MYSITE.WEB
)有誰知道如何獲取在 IIS 中配置的該站點的名稱(使用正確的大小寫)?
APPL_MD_PATH
服務器變量。
"
APPL_MD_PATH
- 檢索應用程序的元數據庫路徑。"
像這樣:
// This code assumes HttpContext is available, such as in a Middleware method or `Controller` subclass.
using Microsoft.AspNetCore.Http;
String? iisMetabasePath = httpContext.GetServerVariable("APPL_MD_PATH");
// or (long-form):
String? iisMetabasePath = HttpContextServerVariableExtensions.GetServerVariable( httpContext, "APPL_MD_PATH" );
然后只需修剪/LM/W3SVC/
部分。
請注意,當您在 IIS 之外運行代碼時,例如使用 ASP.NET Core 的開發服務器,所有特定於 IIS 的數據(例如"APPL_MD_PATH"
將不可用,因此請確保您也在處理這種情況。
ApplicationRoot
發生了什么?是時候淘汰ILSpy 了……
HttpRequest.ApplicationPath
是HttpRuntime.AppDomainAppVirtualPath
。HttpRuntime.AppDomainAppVirtualPath
是VirtualPath.GetVirtualPathStringNoTrailingSlash(HttpRuntime._theRuntime._appDomainAppVPath)
。HttpRuntime._theRuntime._appDomainAppVPath
在HttpRuntime.Init()
中設置。HttpRuntime.Init()
從HttpRuntime.GetAppDomainString(".appVPath"))
設置_appDomainAppVPath
。
AppDomain
關聯的小型可序列化標量值。System.Web
)為 IIS 中的每個應用程序 Scope創建一個新的AppDomain
。".appVPath"
的String
值從何而來……System.Web.Hosting.ApplicationManager::PopulateDomainBindings
設置dict.Add(".appVPath", appVPath.VirtualPathString)
Host
header 綁定完全無關。是的,重載術語。PopulateDomainBindings
由System.Web.Hosting.ApplicationManager::CreateAppDomainWithHostingEnvironment
調用。
virtualPath: VirtualPath.Create(appHost.GetVirtualPath())
。appHost.GetVirtualPath()
是IApplicationHost.GetVirtualPath()
。
System.Web.Hosting.ISAPIApplicationHost
和System.Web.Hosting.SimpleApplicationHost
。 我們對ISAPIApplicationHost
感興趣。ISAPIApplicationHost
從運行時參數到IAppManagerAppDomainFactory.Create
方法中的String appId
和String appPath
appPath 獲取其 virtualPath。
IAppManagerAppDomainFactory
是IIS直接使用的一個COM接口。
IAppManagerAppDomainFactory
定義的痕跡,但一無所獲。
webengine4.dll
處理,它是原生的 DLL,我現在沒有時間淘汰 Ghidra ...HttpExtensionProc
(及其LPEXTENSION_CONTROL_BLOCK
參數)不包含 IIS 應用程序 Scope AppId
或虛擬路徑,這讓我感到驚訝 - 但最重要的是:這表明該值可能來自GetServerVariable
或ServerSupportFunction
回調。 ...IWpfApplicationInfoUtil::GetApplicationPropertiesFromAppId
方法(這里的“WPF”表示“ Worker Process Framework ”,與其他與 UI 相關的 WPF 完全無關)。
IMetadataInfo.GetMetaPath()
方法公開的相同數據(該方法返回"LM/WEBROOT/AppHost/{SiteId}"
形式的字符串)。IWpfApplicationInfoUtil
接口引用呢?
IWorkerProcessFramework->GetWpfInterface(WPF_APPLICATION_INFO_UTIL_ID)->GetApplicationPropertiesFromAppId
IWorkerProcessFramework
呢?
w3wp.exe
worker DLL 。AspNetCoreModuleV2
做了什么......AspNetCoreModuleV2
使用 IIS 的IHttpApplication
, derp 。
IHttpApplication
公開GetAppConfigPath()
,它還返回/LM/W3SVC/1/ROOT/{Site Name}
形式的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.