【问题标题】:How to tell if I'm running under a web server or not?如何判断我是否在 Web 服务器下运行?
【发布时间】:2010-10-19 04:51:02
【问题描述】:

我正在编写一个 C# .NET 模块,我想使用提供者模式。

如果我的代码在 Web 服务器上运行,我可以访问 System.Web.Configuration 并且可以调用 ProvidersHelper 来加载由 web.config 数据确定的适当提供程序。

如果我的代码在独立环境中运行,我将无法访问此类。

在我看来,我可能会编写一个包装类,它使用反射来 (a) 确定我是否可以访问内置的 System.Web.Configuration.ProvidersHelper,如果不能,(b) 提供一个功能等效的接口,仅依赖关于我在单机模式下可用的资源。

有没有人以前遇到过这个问题和/或有建议?

【问题讨论】:

    标签: .net iis design-patterns provider


    【解决方案1】:

    检查 HttpContext.Current 是否不为空:

    if(HttpContext.Current!=null)
       // I'm running on a web server
    

    【讨论】:

    • 谢谢,但不幸的是,如果我在独立模式下运行,我也无法访问 System.Web,因此我无法编译该代码。如果 MS 将 ProvidersHelper 放入非 Web 类中,我的问题将毫无意义。
    • 鉴于您的项目将引用 System.Web(或无法编译),您应该有权访问 System.Web。
    • 响应 R.Bemrose,代码用于两个不同的程序集,其中只有一个是 Web 服务器。一个项目有一个对 System.Web 的引用,而另一个不需要一个(除了这个依赖项。)
    【解决方案2】:

    如果您想避免对 System.Web 程序集的引用,您必须创建一个接口来公开您感兴趣的信息,并让您的消费者酌情提供此接口的实现者:

    // Core assembly, doesn't reference System.Web
    public class ThisUsesProviders {
        public ThisUsesProviders(IProviderProvider pp) { ... }
    }
    
    public interface IProviderProvider {
       SpecialProvider InstantiateSpecialProvider(/* custom arguments */);
    }
    
    // Helper assembly, references System.Web
    public class DefaultProviderProvider : IProviderProvider
    {
        SpecialProvider InstantiateSpecialProvider(/* custom arguments */)
        {
            // call ProvidersHelper 
        }
    }
    
    // standalone consumer:
    var thing = new ThisUsesProvider(new NonStandardProvider());
    
    // ASP.NET:
    var thing = new ThisUsesProvider(new DefaultProviderProvider());
    

    这种模式称为Dependency InjectionInversion of Control

    【讨论】:

    • 谢谢大卫。我想这正是我要找的! -- SL。
    【解决方案3】:

    您可以创建一个统计 IsWeb 函数,该函数返回 HttpContext.Current 是否为空。

    如果它不为空,你就有一个网站,如果它为空,你就没有。

    【讨论】:

      【解决方案4】:

      如果您正在编写一个可以从基于 Web 或非基于 Web 的应用程序访问的模块,恕我直言,处理配置的正确方法是让客户端代码 告诉 em>你在什么环境。这应该是对客户端代码的一个小强加,并且大大降低了你的代码的复杂性。一种可能的解决方案是让客户端传入一个符合相同接口的对象(尽管快速浏览 MSDN 文档显示没有为 ProvidersHelper 定义接口,因此简单的路线已经过时了)。

      【讨论】:

      • 是的,这是您想对 Microsoft 说的事情之一,“您为什么不将 ProvidersHelper(或者至少是它的 I/F)放在 System.Configuration 中? "也许他们很快就会把它搬到那里。
      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 2016-08-06
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2012-03-28
      相关资源
      最近更新 更多