我有一个我编写的代码库,可以在桌面应用程序和Web服务器上使用。该库有时需要知道它正在运行的环境。
在过去,我依靠System.Web.Hosting.HostingEnvironment.IsHosted
来判断代码是否在Web服务器上运行。不幸的是, asp.net core mvc 无法访问System.Web
命名空间,所以我需要另一种机制。
如果其中一种可能性是asp.net core mvc,代码如何判断它是否在Web服务器上运行?
答案 0 :(得分:1)
不幸的是,目前没有等效的API。当您查看该属性的工作方式时,您可以轻松地自己完成相同的操作 - 无需假设哪个服务器托管您的应用程序。
您必须使用静态公共属性设置API:
namespace My.Project
{
public static HostingEnvironment
{
public static bool IsHosted { get; private set; }
public static void SetIsHosted(this IServicesCollection services)
{
// you can grab any other info from your services collection
// if you want. This is an extension method that you call
// from your Startup.ConfigureServices method
IsHosted = true;
}
}
}
所以现在你有一些适用于ASP.Net MVC 5和4.5的东西。您可以将其集成到Startup.ConfigureServices()
方法中。
public void ConfigureServices(IServiceCollection services)
{
// Set up whatever services you want here.
// Make sure you have your My.Project namespace
// in your using statements so you can use the IsHosted()
// extension method
services.SetIsHosted();
}
此解决方案与旧版System.Web.Hosting.HostingEnvironment.IsHosted
解决方案之间的唯一区别是,当IIS自动启动应用程序时,框架会设置该标志。这可能与您将要获得的等效解决方案尽可能接近,同时仍允许在任何地方托管。
答案 1 :(得分:1)
回答我自己的问题以防万一。
有人提到,确定代码是否在Web服务器或桌面应用程序上运行的一种方法是查看它运行的进程的名称。这绝对是可能的,但是我几乎无法控制Web应用程序的进程名称,如果历史记录有任何迹象,该名称将来可能会发生变化。
相反,我选择根据应用程序的配置文件名进行确定。此文件名对于网络应用和桌面应用程序而言是不同的,并且它作为开发人员在我的控制之下更为重要。
我写的方法是:
public bool IsWebServer {
get {
string file = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile.ToLower();
//web.config used by asp.net 4.X,
//app.config used by MVC Core
//NameOfTheApp.exe.config used by desktop applications
if(file.Contains("web.config") || file.Contains("app.config")) {
return true;
}
return false;
}
}