Программно определить, работает ли код под IIS Express - PullRequest
23 голосов
/ 03 марта 2012

Я не уверен, что это даже возможно, но я надеюсь получить подсказку, чтобы определить, выполняется ли код, который в настоящее время выполняется, в IIS Express.Мое лучшее приближение на данный момент, которое невероятно хакерское и в какой-то момент обязательно провалится / сломается:

bool IsExpress = 
  Request.ServerVariables["SERVER_SOFTWARE"] == "Microsoft-IIS/7.5"
  && Int32.Parse(Request.ServerVariables["INSTANCE_ID"]) > 1000000000;

Конечно, должен быть лучший путь.Моя проверка объектов Application, Server и Request не показала ничего, что могло бы обеспечить лучшее понимание.Возможно, мне просто нужно посмотреть на какой-нибудь другой объект?

Обновление:

Мне действительно любопытно, если есть способ обнаружить это - это действительно академично в этомУ меня нет острой необходимости использовать его.Оригинальный вопрос стоит.Но в духе ответа на комментарии, в частности, мне интересно ответить на критику другого вопроса / ответа на этом сайте: Как выполнить поиск на карте MIME сервера .Критика заключается в том, что опубликованный ответ не работает для IIS Express, а только для традиционных экземпляров IIS.IIS Express хранит конфигурацию MIME в XML-файле applicationhost.config, и я хотел бы обновить этот ответ, чтобы обеспечить способ возврата этой информации также для IIS Express.Конечно, я мог бы просто добавить некоторый код, который получает соответствующее значение из XML (Yay для LINQ to XML!), Но я действительно хотел бы сделать его умнее.Чтобы было ясно, мне не нужна помощь в разборе этого файла - просто что-то более элегантное в попытке определить, выполняется ли код в настоящее время в движке IIS Express.

Обновление 2:

IIS 8.0 Express Beta была выпущена на этой неделе , и это также показывает, что подход в моем вопросе хрупок и сломается.Хотя нацеливание на конкретную версию не является нарушением условий соглашения, было бы неплохо учесть это и попытаться убедиться, что код будет работать по крайней мере с известными сегодня версиями.

Ответы [ 4 ]

27 голосов
/ 06 марта 2012

Будет ли проверка текущего имени процесса работать?

bool isExpress = 
  String.Compare(Process.GetCurrentProcess().ProcessName,"iisexpress") == 0;

Обычный IIS работает под w3wp.exe из памяти.

2 голосов
/ 25 сентября 2018

Ответ Орана Деннисона больше не работает для меня с ядром dotnet.

Я расширил его, сначала создав метод, который может получить родительский процесс:

/// <summary>
/// A utility class to determine a process parent.
/// </summary>
/// <remarks>
/// From https://stackoverflow.com/a/3346055/240845
/// </remarks>
public static class ParentProcessUtilities
{
    /// <summary>
    /// Gets the parent process.
    /// </summary>
    /// <param name="process">The process to get the parent of</param>
    /// <returns>The parent process.</returns>
    public static Process Parent(this Process process)
    {
        return GetParentProcess(process.Handle);
    }

    /// <summary>
    /// Gets the parent process of the current process.
    /// </summary>
    /// <returns>An instance of the Process class.</returns>
    public static Process GetParentProcess()
    {
        return Process.GetCurrentProcess().Parent();
    }

    /// <summary>
    /// Gets the parent process of a specified process.
    /// </summary>
    /// <param name="handle">The process handle.</param>
    /// <returns>The parent process.</returns>
    public static Process GetParentProcess(IntPtr handle)
    {
        ProcessInformation pbi = new ProcessInformation();

        // Note, according to Microsoft, this usage of NtQueryInformationProcess is 
        // unsupported and may change
        int status = NtQueryInformationProcess(
            handle, 0, ref pbi, Marshal.SizeOf(pbi), out _);
        if (status != 0)
        {
            throw new Win32Exception(status);
        }

        try
        {
            return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32());
        }
        catch (ArgumentException)
        {
            // not found
            return null;
        }
    }

    [DllImport("ntdll.dll")]
    private static extern int NtQueryInformationProcess(
        IntPtr processHandle, int processInformationClass,
        ref ProcessInformation processInformation, int processInformationLength, 
        out int returnLength);

    /// <summary>
    /// Used in the NtQueryInformationProcess call.
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct ProcessInformation
    {
        // These members must match PROCESS_BASIC_INFORMATION
        internal IntPtr Reserved1;
        internal IntPtr PebBaseAddress;
        internal IntPtr Reserved2_0;
        internal IntPtr Reserved2_1;
        internal IntPtr UniqueProcessId;
        internal IntPtr InheritedFromUniqueProcessId;

    }
}

Затем вы можете сделать что-то вроде:

public bool IsUnderIisExpress()
{
    var currentProcess = Process.GetCurrentProcess();
    if (string.CompareOrdinal(currentProcess.ProcessName, "iisexpress") == 0)
    {
       return true;
    }

    var parentProcess = currentProcess.Parent();
    if (string.CompareOrdinal(parentProcess.ProcessName, "iisexpress") == 0
        || string.CompareOrdinal(parentProcess.ProcessName, "VSIISExeLauncher") == 0)
    {
        return true;
    }

    return false;
}
2 голосов
/ 11 марта 2012

Не можем ли мы попытаться выяснить, работает ли одно или несколько ограничений IIS Express или нет, если оно работает, это не IIS Express. Пример IIS Express не поддерживает службы sharepoint

2 голосов
/ 06 марта 2012

Если вы не против зайти в API уровня COM, вы можете использовать API IIS Version Manager

http://msdn.microsoft.com/en-us/library/gg418429.aspx

В этом посте SO обсуждается, как это используется: Программный запуск и остановка IIS Express - не совсем то, что вам нужно, но они обсуждают использование API.

Редактировать: Я должен добавить, что я сам не пробовал, но это обещает, удачи!

...