簡體   English   中英

如何確定當前應用程序是否為 ASP.NET web 應用程序

[英]How to find out if the current application is an ASP.NET web app

從托管 class 庫中,我想了解當前執行的應用程序是否是 ASP.NET web 應用程序(web ZAC68B64VC 或不是368ACCEFE2)。

我已經看到了不同的方法來做到這一點,例如通過檢查以下之一:

  • System.Web.Hosting.HostingEnvironment.IsHosted == true
  • System.Web.HttpContext.Current != null
  • System.Web.HttpRuntime.AppDomainAppId != null
  • System.Web.HttpRuntime.Cache != null
  • 檢查web.config文件(注意:我認為這不可靠)

問題是我應該使用哪種方法? 其中一些是無效的(即,即使在 windows 應用程序中運行,它們也可能返回 true)還是它們都相等?


更新/澄清(對不起,如果我的問題不夠清楚):

  • 我有一個由 .net 應用程序運行的托管 class 庫(.net 代碼)(顯然)
  • 此“主機應用程序”可以是 ASP.NET 應用程序(例如 web forms 或 MVC)或 Z0F4137ED8502B5B8 表單)應用程序 0(例如 web
  • 我的問題是:有沒有辦法從我的 class 庫(在運行時)中可靠地確定它是否作為 ASP.NET 應用程序的一部分運行?

注意:我知道我可以實施不同的解決方案(例如,請參閱下面的評論或 Tomas Lycken 的回答),但這不是這個問題的重點。 class 庫已經存在,我想更改盡可能少的代碼!

可能不可靠。 MSDN 暗示這將始終返回一個新的 object 如果一個尚不存在。 因此,從技術上講,有時您可以調用它並且在調用它之前不存在。

    System.Web.Hosting.HostingEnvironment.IsHosted == true

所有 web 環境都需要上下文。 該上下文中的處理程序告訴您 web 環境的類型。 (例如 MvcHandler )。 請注意,對於同一環境,這可能是不同類型的處理程序 - 例如,您可以一起運行 MVC 和 web forms。 它僅取決於當前提供的服務以及它使用的管道。

    System.Web.HttpContext.Current != null

所有 web 應用程序都需要一個應用程序 ID 它是唯一的,不會隨着應用程序池的重新啟動而改變。

    System.Web.HttpRuntime.AppDomainAppId != null

我從未見過這種情況,盡管從邏輯上講,我可以想象沒有使用緩存因此不可靠的時間。

    System.Web.HttpRuntime.Cache != null

你是對的。

檢查 web.config 文件(注意:我認為這不可靠)

我在圖書館中使用這種東西。 我發現它可靠。

         Page page = (HttpContext.Current != null && HttpContext.Current.Handler != null) ? HttpContext.Current.Handler as Page : null;
         if (HttpRuntime.AppDomainAppId != null && page != null)
         {
            //I'm a web forms application
         }
         else if (HttpRuntime.AppDomainAppId != null && page == null && HttpContext.Current != null) { throw new InvalidOperationException("I'm an MVC application"); }
         else throw new InvalidOperationException("Im not ASP.Net web");

我必須在這里質疑您的目標:為什么庫應該知道它運行的是哪種應用程序?

對我來說,聽起來您需要將庫的相關部分分成兩部分 - 一部分用於 web 應用程序,另一部分用於 winforms 應用程序。 (可能還有第三部分,包含兩種類型的應用程序都可以使用的所有內容......)

這可能會有所幫助:

如何檢測我的 .NET 程序集是從 web 站點還是從台式機運行?

if(HttpRuntime.AppDomainAppId != null)
{
  //is web app
}
else
{
  //is windows app
}

首先,我同意這個問題是“錯誤的”。 你的圖書館不應該關心。 其次,如下所示,有許多啟發式方法,但最終沒有真正好的了解方法。 您的問題沒有說明您為什么想知道或對此進行驗證。

也就是說,如果是我,如果我關心當前請求,我可能會查看 System.Web.HttpContext.Current,或者如果我想要進行常規檢查,我可能會查看 System.Web.HttpRuntime.AppDomainAppId。

沒有保證。 這可能是個壞主意。

來自 ASP.NET 團隊的 Stefan:

如果它是 web 應用程序及其正在運行的托管代碼,則其 ASP.NET -) 的可能性為 99.9999%。 如果他的意思有所不同,例如查看 IIS 元數據庫並試圖確定應用程序是否真的是 ASP.NET 應用程序 - 那么就需要某種啟發式方法。 例如,對於 IIS config/metbase 中的給定應用程序,獲取應用程序的物理根目錄 - 然后查看 web.config、*.aspx、*.ashx 等是否存在於該文件夾或任何子文件夾。 如果答案是肯定的,那么很可能是 ASP.NET 應用程序。 不幸的是,僅根據 IIS 存儲的配置數據做出此決定是不夠的。 每個應用程序池都有一個關聯的 CLR 版本,即使沒有托管代碼在應用程序池中運行。 第二個 ASP.NET 與 IIS 集成在一台機器上啟用,默認模塊/處理程序列表都包括 ASP.NET 條目。

在圖書館的情況下,我描述的啟發式方法將是 go 的方式。

但是,現在,什么是“ASP.NET 應用程序”? These days I can stick classic.asp, ASP.NET, static HTML, and php all into the exact same vdir structure and have it all function semi-coherently as a single "application".

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM