У меня есть экземпляр класса общего назначения, который будет выполняться как под ASP.NET и отдельная программа. Этот код чувствителен к процессу, в котором он выполняется - то есть есть методы certin, которые не должны вызываться, если работает под ASP.NET. Как определить, выполняется ли код в ASP.NET процесс?
Ответ на решение, которое я использую в настоящее время, приводится ниже.
Я бы хотел, чтобы кто-нибудь добавил комментарий о том, почему этот вопрос получил отрицательное голосование, и / или предложил бы лучший способ его задать! Я могу только предположить, что по крайней мере некоторые люди посмотрели на вопрос и сказали: «Какой идиот, код ASP.NET - это код .NET».
Это мой ответ на вопрос.
Во-первых, убедитесь, что ваш проект ссылается на 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.
Я думаю, что вы действительно хотите переосмыслить свой дизайн. Лучший способ сделать это - использовать класс 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 вызывается небольшое количество методов.
Это приведет к «ошибке» при работе в потоке, если определение предназначено для «работы в Процесс IIS», в отличие от «работы с текущим / действительным Запрос IIS» (в некоторых случаях это делает имеет значение). Итак, в конце концов, для демонстрации HttpContext.Current != null
, у которого есть проблема, упомянутая выше, требуется много кода. Я не против такой конструкции, но это не относится к исходному вопросу, и необходимо учитывать конкретный контекст.
HttpContext.Current также может иметь значение NULL в ASP.NET, если вы используете асинхронные методы, поскольку асинхронная задача выполняется в новом потоке, который не использует HttpContext исходного потока. Это может быть или не быть тем, что вы хотите, но если нет, то я считаю, что HttpRuntime.AppDomainAppId будет отличным от нуля в любом месте процесса ASP.NET и нулевым в другом месте.
В чем будет преимущество использования HttpRuntiime.AppDomainAppId
по сравнению с ответ Гигада, который использует HostingEnvironment.IsHosted
?
Попробуй это:
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
Воспользуйтесь ссылкой редактировать, чтобы объяснить, как работает этот код, а не просто приводите код, поскольку объяснение с большей вероятностью поможет будущим читателям. См. Также Как ответить. источник
Вы можете найти свой ответ в следующем сообщении SO. stackoverflow.com/questions/2091866/…