![](/img/trans.png)
[英]How can I override the currency formatting for the current culture for an ASP.NET web application?
[英]How to find out if the current application is an ASP.NET web app
从托管 class 库中,我想了解当前执行的应用程序是否是 ASP.NET web 应用程序(web ZAC68B64VC 或不是368ACCEFE2)。
我已经看到了不同的方法来做到这一点,例如通过检查以下之一:
System.Web.Hosting.HostingEnvironment.IsHosted == true
System.Web.HttpContext.Current != null
System.Web.HttpRuntime.AppDomainAppId != null
System.Web.HttpRuntime.Cache != null
web.config
文件(注意:我认为这不可靠)问题是我应该使用哪种方法? 其中一些是无效的(即,即使在 windows 应用程序中运行,它们也可能返回 true)还是它们都相等?
更新/澄清(对不起,如果我的问题不够清楚):
注意:我知道我可以实施不同的解决方案(例如,请参阅下面的评论或 Tomas Lycken 的回答),但这不是这个问题的重点。 class 库已经存在,我想更改尽可能少的代码!
可能不可靠。 MSDN 暗示这将始终返回一个新的 object 如果一个尚不存在。 因此,从技术上讲,有时您可以调用它并且在调用它之前不存在。
System.Web.Hosting.HostingEnvironment.IsHosted == true
所有 web 环境都需要上下文。 该上下文中的处理程序告诉您 web 环境的类型。 (例如 MvcHandler )。 请注意,对于同一环境,这可能是不同类型的处理程序 - 例如,您可以一起运行 MVC 和 web forms。 它仅取决于当前提供的服务以及它使用的管道。
System.Web.HttpContext.Current != null
所有 web 应用程序都需要一个应用程序 ID 。 它是唯一的,不会随着应用程序池的重新启动而改变。
System.Web.HttpRuntime.AppDomainAppId != null
我从未见过这种情况,尽管从逻辑上讲,我可以想象没有使用缓存因此不可靠的时间。
System.Web.HttpRuntime.Cache != null
你是对的。
检查 web.config 文件(注意:我认为这不可靠)
我在图书馆中使用这种东西。 我发现它可靠。
Page page = (HttpContext.Current != null && HttpContext.Current.Handler != null) ? HttpContext.Current.Handler as Page : null;
if (HttpRuntime.AppDomainAppId != null && page != null)
{
//I'm a web forms application
}
else if (HttpRuntime.AppDomainAppId != null && page == null && HttpContext.Current != null) { throw new InvalidOperationException("I'm an MVC application"); }
else throw new InvalidOperationException("Im not ASP.Net web");
我必须在这里质疑您的目标:为什么库应该知道它运行的是哪种应用程序?
对我来说,听起来您需要将库的相关部分分成两部分 - 一部分用于 web 应用程序,另一部分用于 winforms 应用程序。 (可能还有第三部分,包含两种类型的应用程序都可以使用的所有内容......)
这可能会有所帮助:
如何检测我的 .NET 程序集是从 web 站点还是从台式机运行?
if(HttpRuntime.AppDomainAppId != null)
{
//is web app
}
else
{
//is windows app
}
首先,我同意这个问题是“错误的”。 你的图书馆不应该关心。 其次,如下所示,有许多启发式方法,但最终没有真正好的了解方法。 您的问题没有说明您为什么想知道或对此进行验证。
也就是说,如果是我,如果我关心当前请求,我可能会查看 System.Web.HttpContext.Current,或者如果我想要进行常规检查,我可能会查看 System.Web.HttpRuntime.AppDomainAppId。
没有保证。 这可能是个坏主意。
来自 ASP.NET 团队的 Stefan:
如果它是 web 应用程序及其正在运行的托管代码,则其 ASP.NET -) 的可能性为 99.9999%。 如果他的意思有所不同,例如查看 IIS 元数据库并试图确定应用程序是否真的是 ASP.NET 应用程序 - 那么就需要某种启发式方法。 例如,对于 IIS config/metbase 中的给定应用程序,获取应用程序的物理根目录 - 然后查看 web.config、*.aspx、*.ashx 等是否存在于该文件夹或任何子文件夹。 如果答案是肯定的,那么很可能是 ASP.NET 应用程序。 不幸的是,仅根据 IIS 存储的配置数据做出此决定是不够的。 每个应用程序池都有一个关联的 CLR 版本,即使没有托管代码在应用程序池中运行。 第二个 ASP.NET 与 IIS 集成在一台机器上启用,默认模块/处理程序列表都包括 ASP.NET 条目。
在图书馆的情况下,我描述的启发式方法将是 go 的方式。
但是,现在,什么是“ASP.NET 应用程序”? These days I can stick classic.asp, ASP.NET, static HTML, and php all into the exact same vdir structure and have it all function semi-coherently as a single "application".
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.