.NET代码如何知道它是否在Web服务器应用程序中运行?

时间:2010-01-19 07:41:48

标签: .net asp.net

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

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

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

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

感谢。

P.S。

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

修改

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

7 个答案:

答案 0 :(得分:9)

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

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

(根据反射器)

看起来应用域数据中有一个特殊键 - “.appDomain”,在ASP.NET Web服务器上运行时设置。

我会坚持这一点。

答案 1 :(得分:7)

您可以查看

HttpContext.Current

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

请参阅HttpContext.Current Property

答案 2 :(得分:6)

最佳选择是配置设置。

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

这是我想要的选择。

答案 3 :(得分:2)

您可以找出当前的流程名称:

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

然后检查这是ASP.NET process name

答案 4 :(得分:1)

  • BrowserInteropHelper .. ::。IsBrowserHosted    属性
  

获取一个指定是否的值   当前的Windows演示文稿   基金会(WPF)申请是   浏览器托管。

这是如何在XBAP中完成的

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

答案 5 :(得分:0)

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

当然,这取决于你能否轻易做到的情况。

答案 6 :(得分:0)

请参阅我提供的答案here ...

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