我使用通用主机制作了一个简单的ASP.net核心Web API项目:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
现在,我希望能够检测该应用程序是作为命令行应用程序(dotnet myapp.dll
启动的,还是由其他东西(例如IIS)托管的。 / p>
在前一种情况下,我希望能够向控制台提供一些交互性,例如:
public static async Task Main(string[] args)
{
using IHost host = CreateHostBuilder(args).Build();
if (IsConsoleApplication)
{
await host.StartAsync();
while (true)
{
string s = Console.ReadLine();
if (s == "q")
{
await host.StopAsync();
return;
}
//Run command according to the value of s
// ...
}
}
else
{
await host.RunAsync();
}
}
我已经尝试通过以下方式实现IsConsoleApplication
Environment.UserInteractive;
或
Console.In != StreamReader.Null;
但是我没有成功。
有没有进行这种测试的好方法?
答案 0 :(得分:2)
选项1
IIS或IIS Express将设置环境变量,例如IIS_DRIVE,IIS_USER_HOME,ASPNETCORE_IIS_PHYSICAL_PATH等。 因此,您可以通过
检查它们的存在 Environment.GetEnvironmentVariable("....")
但是,您需要测试所有环境,以确保变量足够可靠。
选项2
考虑通过命令行参数(例如。
)启动“交互式”模式的选项。dotnet myapp.dll interactive
在代码中,检查args[0]
的值是否为“ interactive”。