【问题标题】:Detect if request comes from "web site project" or "console project"检测请求是来自“网站项目”还是“控制台项目”
【发布时间】:2012-04-30 05:39:31
【问题描述】:

我想知道检测请求的发送位置(函数调用)的最佳方法是什么

意思:我的项目是这样的:

  • 引擎
  • Web 项目(使用引擎)
  • Test Project-控制台项目(使用引擎)

现在我希望在运行测试项目时,函数中不会执行某些代码。

我知道我可以发送一个布尔参数来检测这一点,但我想知道是否有任何原因检测请求是否来自 web 项目......

谢谢!!

奥雷尔。

【问题讨论】:

标签: c# web console-application


【解决方案1】:

如果被调用的代码应该根据调用来自网络项目还是控制台项目而有所不同,则代码不应位于共享库中。它确实属于各自的项目。

【讨论】:

    【解决方案2】:

    您可以检查HttpContext.Current 不为空。不过,@JustinNiessner 的建议仍然适用。

    【讨论】:

    • 这在大多数情况下都有效,但如果从 global.asax 中的 Application_Start 方法或从新线程调用(可能在其他少数情况下也是如此),它将返回不正确的结果。
    【解决方案3】:

    使用 TESTPROJECT 符号集和不带此符号的 Web 项目编译您的测试项目。然后因为ConditionalAttribute,SetIsFromTest() 方法只有在你的代码是从测试项目中调用时才会执行(因此字段 IsFromTest 将设置为 true)。

    static class Class1
    {
        static bool IsFromTest = false;
    
        static Class1()
        {
            SetIsFromTest();
        }
    
        [Conditional("TESTPROJECT")]
        public static void SetIsFromTest()
        {
            IsFromTest = true;
        }
    

    }

    另一个选项是从您的共享库中测试调用程序集的名称。

    if(System.Reflection.Assembly.GetCallingAssembly().FullName == "...")
    

    【讨论】:

      【解决方案4】:

      您可以使用StackFrame 对象访问堆栈跟踪并查看调用您的之前的方法是什么。通过使用该方法,您可以轻松找到相应的项目。来自老所以post:

      StackTrace trace = new StackTrace();
      int caller = 1;
      StackFrame frame = trace.GetFrame(caller);
      MethodBase callerMethod = frame.GetMethod();
      

      虽然我应该警告你,那是你应该只在娱乐/调试时使用的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        相关资源
        最近更新 更多