【问题标题】:How can a .NET code know whether it is running within a web server application?.NET 代码如何知道它是否在 Web 服务器应用程序中运行?
【发布时间】:2015-03-12 01:51:10
【问题描述】:

我有一个库代码,它应该知道它是在 Web 服务器或独立应用程序服务器的上下文中执行的。

首先想到的是检查应用程序配置文件的名称,如果它是 web.config - 那么这是一个 Web 服务器,否则 - 独立应用程序服务器。

另一种方法是在影子文件夹的路径中查找“临时 ASP.NET 文件”之类的内容。

但我不喜欢这两个,因为它们看起来太老套和脆弱。有没有一种稳健的方法来做我想做的事?

谢谢。

附言

可以定义一个专用的应用配置设置 - IsWebServer,但我更不喜欢它。

编辑:

在寻找另一个问题的解决方案时,我想我解决了这个问题 - 详细信息是 here

【问题讨论】:

  • 为什么需要它来了解它的上下文?
  • 我们为私有探测路径中的第一个文件夹分配了特殊含义。问题是,在 Web 服务器下,我们的逻辑应该会有所不同,因为 Web 服务器和独立应用程序之间的私有探测路径设置存在差异。
  • 也许你应该把它存根,这样你就可以简单地将一个策略模式实现存储到你的框架中,这样框架本身就不需要任何特殊的代码,而是代码存在于你的 Web 应用程序中?
  • Lasse:好主意,不过,他可能需要在某些基础上决定使用它;基础应该是配置设置,恕我直言。
  • 问题是它需要明确的配置设置。我希望避免它。

标签: .net asp.net


【解决方案1】:

试图解决另一个问题,我找到了一个很好的解决方案。 有一个私有方法System.Configuration.SettingsPropertyValue.IsHostedInAspnet,它正是我需要的。作为一个私有方法,我不想调用它(虽然我可以使用反射),但它的实现很简单:

private bool IsHostedInAspnet()
{
    return (AppDomain.CurrentDomain.GetData(".appDomain") != null);
}

(根据反射器)

app域数据中好像有一个特殊的key——“.appDomain”,是在ASP.NET web server中运行时设置的。

我会坚持下去的。

【讨论】:

  • 我真的觉得这很糟糕。它使用了一个可能会改变的实现细节。它适用于单声道吗?我无法想象你为什么不做配置选项。各有千秋。
  • @NoonSilk 是的,我已经做了一些谷歌搜索,似乎 .appDomain 没有公开记录。至于 Mono,它似乎可以工作,因为代码明确设置了一个值 github.com/playscript/playscript-mono/blob/master/mcs/class/…
【解决方案2】:

你可以检查

HttpContext.Current

如果它不为 null,则它从 Web 应用程序运行。

HttpContext.Current Property

【讨论】:

  • 只有当它与请求在同一个线程中运行时才会起作用 - 随后产生的后台线程将没有 HttpContext。
  • @DrJokepu - 准确地说。在我的情况下 HttpContext.Current 为空。
【解决方案3】:

最好的选择是配置设置。

更好的可测试性;更好是因为它清楚地说明了代码将如何工作,而且更好是因为它不依赖于实现细节;您专门从您设置的值分支。可能是您做出的决定并不明显,而您的变量/配置可能会暗示推理。

这是我的选择。

【讨论】:

  • 这对我来说似乎有点短视。例如,作为可以分发和销售以供其他开发人员使用的组件的作者,我希望 Web 进程的许可行为不同于 win 表单或服务或控制台应用程序。我不希望采购开发人员能够“撒谎”他们如何使用该组件,并且我不希望引用 System.Web,因为我的组件将在 .Net 客户端配置文件下工作。我想检测 Web 环境并在内部相应地更改程序集的行为。我目前正在研究如何最好地做到这一点。
【解决方案4】:

你可以找出当前进程名:

Process p = Process.GetCurrentProcess();
string assemblyName = p.ProcessName;

然后检查这是不是ASP.NET process name

【讨论】:

  • 如果它以单声道运行呢?
  • 我认为答案是一样的。代码将在 web 服务器宿主进程的上下文中执行。
【解决方案5】:
  • BrowserInteropHelper..::.IsBrowserHosted 物业

获取一个值,该值指定是否 当前的 Windows 演示文稿 基金会 (WPF) 应用程序是 浏览器托管。

这就是它在 XBAP 中的完成方式

或者如果你有一个 appdomain 做反射并从中得到一些东西?使用

【讨论】:

    【解决方案6】:

    我认为最好的做法是将库拆分为 2 个 dll,一个是真正通用的,一个(需要 ASP.NET 的)仅在网站中加载。检查它当前是否在 ASP.NET 中运行感觉有点像 hack。

    当然,这取决于您是否可以轻松做到这一点。

    【讨论】:

      【解决方案7】:

      查看我提供的答案here...

      基本上,你可以使用HostingEnvironment.IsHosted

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 2013-02-22
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        相关资源
        最近更新 更多