Asp.net 如何判断代码是否在不使用System.web的情况下在web服务器上运行?

Asp.net 如何判断代码是否在不使用System.web的情况下在web服务器上运行?,asp.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,Asp.net,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,我有一个我编写的代码库,可以在桌面应用程序和web服务器上使用。该库有时需要知道它运行在哪个环境中 在过去,我一直依靠System.Web.Hosting.HostingEnvironment.IsHosted来判断代码是否在Web服务器上运行。不幸的是,asp.net核心mvc无法访问System.Web命名空间,因此我需要另一种机制 如果这些可能性之一是asp.net核心mvc,那么代码如何判断它是否在web服务器上运行?不幸的是,目前没有等效的API。当您了解该属性的工作方式时,您可以轻松

我有一个我编写的代码库,可以在桌面应用程序和web服务器上使用。该库有时需要知道它运行在哪个环境中

在过去,我一直依靠
System.Web.Hosting.HostingEnvironment.IsHosted
来判断代码是否在Web服务器上运行。不幸的是,asp.net核心mvc无法访问
System.Web
命名空间,因此我需要另一种机制


如果这些可能性之一是asp.net核心mvc,那么代码如何判断它是否在web服务器上运行?

不幸的是,目前没有等效的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.NETMVC5和4.5的东西。您可以将其集成到您的方法中


此解决方案与传统的
System.Web.Hosting.HostingEnvironment.IsHosted
解决方案之间的唯一区别在于,当IIS自动启动应用程序时,该标志由框架设置。这可能与您将要获得的等效解决方案非常接近,同时仍然允许在任何地方进行托管。

回答我自己的问题以防对其他人有所帮助

有人提到,确定代码是否在web服务器或桌面应用程序上运行的一种方法是查看它所运行的进程的名称。这当然是可能的,但我无法控制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;
        }
    }

老实说,让调用应用程序传递一个值,该值在构造函数中指示此事实。。。不要小题大做。。。如果你能。。。另一个选择是,我想你可以得到你的应用程序运行的当前用户,在asp.net中,我相信它运行在aspnetusr帐户或类似的帐户上……我可以添加一个配置设置,然后将该配置设置传递到库中,但我更愿意让代码自己感知环境。也许这个答案有帮助?根据答案你会做出什么决定?我想知道这些是否还相关。不确定这是否适用于您的场景,但是否可以只提供两个库,让消费者决定是在服务器上还是在其他地方运行?Berin-感谢您提供了详细的答案。您的方法确实包含一些见解,但归根结底,它仍然归结为在启动时硬编码一个a变量,然后检查它。我更喜欢让代码根据它从环境中观察到的东西来确定它是否在web服务器上运行,这不是我的应用程序所特有的。这基本上就是以前代码的工作方式,它只是由框架为您设置的。您在环境中唯一可以观察到的是进程名称,但这也有问题,因为您不能保证使用一个静态的进程名称列表。它可能是唯一可用的选项。此解决方案不再有效,因为从ASP.NET Core 1.0开始,AppDomain.CurrentDomain.SetupInformation.ConfigurationFile.ToLower()返回一个exe.config文件。因此,它看起来与作为桌面应用程序运行完全相同。所以我求助于手动设置一个配置参数来指示代码是否在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;
        }
    }