[英]Programmatically determine if code is running under IIS Express
我不確定這是否可能,但我希望找到一條線索,以確定當前正在執行的代碼是否在IIS Express下運行。 到目前為止,我的最佳近似值,令人難以置信的hackish,肯定會在某些時候失敗/突破:
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配置存儲在applicationhost.config XML文件中,我想更新該答案,以便為IIS Express提供返回該信息的方法。 我當然可以添加一些從XML中獲取適當值的代碼(Yay for LINQ to XML!)但我真的想讓它變得更聰明。 為了清楚起見,我不需要幫助解析該文件 - 只是嘗試檢測代碼當前是否在IIS Express引擎中執行時更優雅。
更新2:
IIS 8.0 Express Beta 本周發布 ,它進一步表明我的問題中的方法很脆弱並且會破壞。 雖然它不是針對特定版本的交易破壞者,但考慮到這一點並嘗試確保代碼至少與今天的已知版本一起使用將會很好。
檢查當前進程名稱會起作用嗎?
bool isExpress =
String.Compare(Process.GetCurrentProcess().ProcessName,"iisexpress") == 0;
正常的IIS在內存中運行w3wp.exe
。
Oran Dennison的回答對我來說不再適用於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;
}
如果您不介意放入COM級API,則可以使用IIS Version Manager API
http://msdn.microsoft.com/en-us/library/gg418429.aspx
有關如何在此SO帖子中使用它的一些討論:以編程方式啟動和停止IIS Express - 不完全是您想要的,但他們確實討論了使用API。
編輯:我應該補充一點,我自己沒試過,但看起來很有希望,祝你好運!
我們是否可以嘗試查看IIS Express的一個或多個限制是否有效,如果有效則不是IIS Express。 示例IIS Express不支持sharepoint服務
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.