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

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

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


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

Вы можете найти свой ответ в следующем сообщении SO. stackoverflow.com/questions/2091866/…

deostroll 03.10.2011 17:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
1
3 192
6

Ответы 6

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

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

public class SomeClass {

  public bool  RunningUnderAspNet    { get; private set; }


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

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

HttpContext - это имя класса, поэтому HttpContext не может иметь значение null.

yfeldblum 16.10.2008 23:13

Я думаю, что вы действительно хотите переосмыслить свой дизайн. Лучший способ сделать это - использовать класс 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 ...
    }
}

Хорошая идея и способ слишком сложный для того, что мне нужно, а именно выбросить исключение, когда при работе под ASP.NET вызывается небольшое количество методов.

jr. 17.10.2008 09:36

Это приведет к «ошибке» при работе в потоке, если определение предназначено для «работы в Процесс IIS», в отличие от «работы с текущим / действительным Запрос IIS» (в некоторых случаях это делает имеет значение). Итак, в конце концов, для демонстрации HttpContext.Current != null, у которого есть проблема, упомянутая выше, требуется много кода. Я не против такой конструкции, но это не относится к исходному вопросу, и необходимо учитывать конкретный контекст.

user2864740 08.02.2018 22:19

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

В чем будет преимущество использования HttpRuntiime.AppDomainAppId по сравнению с ответ Гигада, который использует HostingEnvironment.IsHosted?

Metro Smurf 24.02.2017 18:14

Попробуй это:

using System.Web.Hosting;

// ...

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

Сработало у меня!

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

using System.Diagnostics; 

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

Воспользуйтесь ссылкой редактировать, чтобы объяснить, как работает этот код, а не просто приводите код, поскольку объяснение с большей вероятностью поможет будущим читателям. См. Также Как ответить. источник

Jed Fox 09.01.2017 14:15

Другие вопросы по теме