Как определить, работает ли .NET-код в процессе ASP.NET?

У меня есть экземпляр класса общего назначения, который будет выполняться как в ASP.NET и автономной программы. Этот код очень чувствителен к процессу, в котором он запускается - то есть существуют сертификационные методы, которые не должны вызываться, если работает под ASP.NET. Как вы определяете, выполняется ли код в ASP.NET? Процесс?

Решение, которое я использую в настоящее время, приведен ниже.


Я хочу, чтобы кто-то добавил комментарий о том, почему этот вопрос получил downvoted и/или предложить лучший способ спросить об этом! Я могу только предположить, что по крайней мере некоторые люди рассмотрели вопрос и сказали: "Какой идиот, код ASP.NET - это .NET-код".

Ответы

Ответ 1

HttpContext.Current также может быть пустым в ASP.NET, если вы используете асинхронные методы, поскольку асинхронная задача происходит в новом потоке, который не передает HttpContext исходного потока. Это может быть или не быть тем, что вы хотите, но если нет, то я считаю, что HttpRuntime.AppDomainAppId будет не нулевым нигде в процессе ASP.NET и нигде в другом месте.

Ответ 2

Я думаю, что вы действительно хотите переосмыслить свой дизайн. Лучший способ сделать это - использовать класс Factory, который создает разные версии необходимых вам классов (предназначенные для реализации интерфейсов, поэтому вы можете использовать их взаимозаменяемо) в зависимости от того, как приложение запускается. Это позволит локализовать код для обнаружения веб-и не-веб-использования в одном месте, а не рассеивать его по всему вашему коду.

public interface IDoFunctions
{
    void DoSomething();
}

public static class FunctionFactory
{
  public static IDoFunctions GetFunctionInterface()
  {
     if (HttpContext.Current != null)
     {
        return new WebFunctionInterface();
     }
     else
     {
        return new NonWebFunctionInterface();
     }
   }
}

public IDoFunctions WebFunctionInterface
{
    public void DoSomething()
    {
        ... do something the web way ...
    }
}

public IDoFunctions NonWebFunctionInterface
{
    public void DoSomething()
    {
        ... do something the non-web way ...
    }
}

Ответ 3

Попробуйте следующее:

using System.Web.Hosting;

// ...

if (HostingEnvironment.IsHosted)
{
    // You are in ASP.NET
}
else
{
    // You are in a standalone application
}

Работал для меня!

Подробнее см. HostingEnvironment.IsHosted...

Ответ 4

using System.Diagnostics; 

if (Process.GetCurrentProcess().ProcessName == "w3wp")
    //ASP.NET

Ответ 5

Это мой ответ на вопрос.

Сначала убедитесь, что ваш проект ссылается на System.Web и что ваш файл кода "используется System.Web;".

public class SomeClass {

  public bool  RunningUnderAspNet    { get; private set; }


  public SomeClass()
    //
    // constructor
    //
  {
    try {
      RunningUnderAspNet = null != HttpContext.Current;
    }
    catch {
      RunningUnderAspNet = false;
    }
  }
}

Ответ 6

If HttpContext Is Nothing OrElse HttpContext.Current Is Nothing Then
  'Not hosted by web server'
End If