我有一个库代码,应该知道它是在Web服务器还是独立应用程序服务器的上下文中执行。
显而易见的是检查应用程序配置文件的名称,如果它是web.config - 那么这是一个Web服务器,否则 - 独立的应用程序服务器。
另一种方法是在影子文件夹的路径中查找类似“临时ASP.NET文件”的内容。
但我不喜欢这两个,因为它们看起来太脆弱和脆弱。有没有一种强有力的方法来做我想要的事情?
感谢。
P.S。
可以定义一个专用的应用程序配置设置--IsWebServer,但我更不喜欢它。
修改
在寻找另一个问题的解决方案时,我想我解决了这个问题 - 细节是here
答案 0 :(得分:9)
试图解决另一个问题,我找到了一个很好的解决方案。
有一个私有方法System.Configuration.SettingsPropertyValue.IsHostedInAspnet
,它完全符合我的需要。作为一个私有方法,我不想调用它(虽然我可以使用反射),但它的实现是微不足道的:
private bool IsHostedInAspnet()
{
return (AppDomain.CurrentDomain.GetData(".appDomain") != null);
}
(根据反射器)
看起来应用域数据中有一个特殊键 - “.appDomain”,在ASP.NET Web服务器上运行时设置。
我会坚持这一点。
答案 1 :(得分:7)
答案 2 :(得分:6)
最佳选择是配置设置。
对可测试性更好;它更好,因为它是代码如何工作的明显陈述,而且它更好,因为它不依赖于实现细节;你专门从你设置的值分支。这可能是你做出的决定是不明显的,你的变量/配置可能暗示了推理。
这是我想要的选择。
答案 3 :(得分:2)
您可以找出当前的流程名称:
Process p = Process.GetCurrentProcess();
string assemblyName = p.ProcessName;
然后检查这是ASP.NET process name
答案 4 :(得分:1)
获取一个指定是否的值 当前的Windows演示文稿 基金会(WPF)申请是 浏览器托管。
这是如何在XBAP中完成的
或者如果你有appdomain做反射并从中得到一些东西?使用
答案 5 :(得分:0)
我认为最好的办法是将库拆分为2个dll,一个是真正通用的,一个(需要ASP.NET的)只能在网站中加载。检查它当前是否在ASP.NET中运行感觉有点像黑客。
当然,这取决于你能否轻易做到的情况。
答案 6 :(得分:0)
请参阅我提供的答案here ...
基本上,您可以使用HostingEnvironment.IsHosted。