【问题标题】:How to tell if code is running locally from Visual Studio/Cassini如何判断代码是否在 Visual Studio/Cassini 本地运行
【发布时间】:2013-05-28 17:46:31
【问题描述】:

我有一个接口,我们称之为ILocateLogFile,它具有用于开发/测试版/生产服务器的标准实现,并且仅适用于本地开发环境。我似乎想不出一种干净的方式来决定(最好在编译时,但运行时会很好)我​​是在本地运行还是在服务器上运行。这是托管在 IIS 上的 WCF 应用程序,如果这很重要的话。

我想出的最好办法是使用编译器符号,例如:

    ILocateLogFile locateLogFile;
#if DEBUG
    locateLogFile = new DevSandboxLogFileLocator();
#else
    locateLogFile = new LogFileLocator();
#endif

问题是,编译符号由构建设置,我无法控制,我想确定。没有一些自动的方法来检查 Visual Studio 的存在吗?或者至少检查 Cassini 而不是 IIS?

【问题讨论】:

  • 我之前已经通过在 if else 语句中检查服务器名称变量来解决这个问题。
  • 有什么理由不使用 .config 文件来配置日志记录? (可能您已经为每个环境设置了不同的 .config,因此添加日志记录也可能很简单)。
  • @RandomUs1r 这是个好建议,但我不能使用System.Web.HttpContext,因为我的 WCF 服务没有使用 ASP.Net 兼容性...
  • @AlexeiLevenkov 我确实有一个理由,尽管可能不是一个令人信服的理由——我们在本地运行与开发服务器上相同的 .config。

标签: c# wcf visual-studio iis compiler-directives


【解决方案1】:

我做了这两种方法1你可以检查进程名称

bool isRunningInIisExpress = Process.GetCurrentProcess()
                                .ProcessName.ToLower().Contains("iisexpress");

或者使用自定义设置更新您的配置文件

<appSettings>
    <add key="ApplicationEnvironment" value="LOCAL_DEV" />
</appSettings>

您专门针对每个环境进行更新并让您的应用程序查询

我不确定是否有办法在编译时确定这一点,除了为每个环境设置一个特殊的构建配置并为每个构建放置一个自定义 PRAGMA。我个人认为这不是那么优雅,但它也可以工作。

【讨论】:

  • 谢谢,我认为第一个选项正是我想要的——尽管我的进程名称似乎是“WebDev.WebServer40”而不是“iisexpress”。
  • 如果您使用的是内置开发服务器,这很有意义。您可能需要考虑切换到 IIS Express。我发现它更加健壮,并且内置于 VS 2012/2010 SP1 中。
【解决方案2】:

我在这里找到了它,它对我有用- Determine if ASP.NET application is running locally

bool isLocal = HttpContext.Current.Request.IsLocal;

【讨论】:

    【解决方案3】:

    这是我使用的代码

    If Debugger.IsAttached Then
     ' Since there is a debugger attached,
     ' assume we are running from the IDE
    Else
     ' Assume we aren't running from the IDE
    End If
    

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 2018-09-13
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多