Как определить, работает ли .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