【问题标题】:ASP.NET Command Line ArgumentsASP.NET 命令行参数
【发布时间】:2017-10-22 13:47:45
【问题描述】:

我很好奇将参数传递给 MVC 应用程序(Web 应用程序、rest 服务等)的选项。然而,我能找到的似乎没有对此的支持......

如果我修改应用的 Application_Start 方法(在 Globals.asax.cs 中)并添加如下语句:

Environment.GetCommandLineArgs()

然后在 Visual Studio 调试器下运行,我可以看到有四个 args 正在传递。

这些是:

iisexpress.exe 文件的路径。

applicationhost.config 的路径

一个“/site”参数。

一个“/apppool”参数。

这表明实际上有一种方法可以传递参数,但没有人谈论它并且没有记录。我想在这里添加另一个自定义 arg,我们自己的代码可以查找并响应它是否存在。

【问题讨论】:

  • 可能这些是 IISExpress 的命令行参数,而不是您的应用程序

标签: c# asp.net asp.net-mvc configuration


【解决方案1】:

ASP.NET 网站不是 Windows 应用程序。例如,它没有 .exe。相反,ASP.NET 网站包含一系列符合特定接口的类,这些类作为插件被拉入 IIS 进程,特别是继承自 HttpApplication 的Global.asax。当一个 HTTP 请求进来时,IIS 实例化 HttpApplication 并从那里开始;这不像从命令行运行程序。

如果您尝试通过各种 API 了解有关应用程序进程(例如命令行参数)的信息,您很可能会得到的信息不是关于您的网站,而是关于整个 IIS 服务进程的信息。

无法向 ASP.NET 网站提供自定义命令行参数。我建议您考虑改用 Environment variables、注册表项或 web.config 项。

【讨论】:

  • 是的,我可以看到这一点,但想要一些简单的方法将其传递给应用程序(配置文件之外)和调试会话等。如果微软设计了这将非常好ASP.NET 以便可以提供命令行参数(在调试和 IIS 配置中)。
  • 如果您能告诉我为什么配置文件不适合您的目的,我或许可以提供更多指导。命令行参数对于 ASP.NET 应用程序来说将是一个奇怪的范例,因为它们一直在启动和回收自己,而无需任何用户干预。
  • 我们使用了一个大大增强的配置系统,其中包含几个自定义部分(巧合的是,它与 .Net 核心中现在的内容相似)。我们的配置文件包含一个 部分,里面有多个 部分,每个部分都有一个 'zone' 属性,此字符串命名环境('production'、'development' 等)。每个 中都有应用程序设置和连接字符串。还有另一个部分 映射到本地文件 - 这定义了区域等。我想避免这种情况并以某种方式传递区域。
  • 换句话说,我不需要查看部署部分(从文件加载)来查看正在使用的区域,而是完全避免使用该文件。 web.config 是 100% 通用的,并且在不更改任何环境的情况下进行部署,其中使用的部分是由 deployment.config 文件驱动的 - 但是这可能会意外地被复制/更改,我想尝试消除这个如果 pos .
  • 我建议Zone应该是机器配置的一部分,而不是与网站一起部署,所以例如你可以把它放在Machine.configApplicationHost.config或者你可以添加一个注册表项(例如HKLM\Software\Your Company\Zone)。另一种选择是查看 HTTP 请求中的 Host 标头,它会告诉您站点正在运行的完全限定域名。
【解决方案2】:

我想简单地扩展上面@Steve 的评论。

典型的 ASP.NET Web 应用程序始终由进程托管。这使Environment.GetCommandLineArgs 有可能返回您发现的一些值。但是,通过这种方式传递信息会很棘手,因为在很多情况下,您没有一种有意义的方式来传递您想要的值。

Visual Studio 中的 IIS Express

当你在VS中调试一个项目时,它通常是在IIS Express上运行的,VS并没有给你提供配置传递哪些参数的地方。 (ASP.NET Core 项目可能会有所不同。)

Windows 服务器上的 IIS

当您的应用最终部署到生产服务器时,它会在 IIS 上运行。 IIS 工作进程 (w3wp.exe) 完全由 Windows Process Activation Service 管理,因此您无法设置要传递的参数。

自托管

某些项目类型(ASP.NET Web API/SignalR/WCF)允许您在控制台进程中进行自托管。在这种情况下,您可以处理命令行参数。

但是,总而言之,命令行参数并不是 Microsoft 将信息传递给 ASP.NET 应用程序的设计的一部分。不要在这条路上走得太远。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2016-03-25
    • 2011-02-25
    • 2013-02-14
    相关资源
    最近更新 更多