启动IIS Express以运行ASP.NET Core Apps

时间:2017-12-20 05:45:07

标签: asp.net-core iis-express

我希望通过使用命令行从IIS Express启动我的ASP.NET核心应用程序。

我偶然发现了this文章

  

实际上,Visual Studio默默地添加了两个环境变量   启动IIS Express时,可以使ASP.NET Core相关位   注入。

     

LAUNCHER_ARGS:-debug -p“C:\ Program Files \ dotnet \ dotnet.exe”-a“exec   \“C:\ Users \ lextm \ documents \ visual studio   2017年\项目\ WebApplication2 \ WebApplication2 \ BIN \调试\ netcoreapp1.0 \ WebApplication2.dll \””   -pidFile“C:\ Users \ lextm \ AppData \ Local \ Temp \ 2 \ tmpFD6D.tmp”-wd“C:\ Users \ lextm \ documents \ visual studio   2017 \项目\ WebApplication2 \ WebApplication2”

-pidFile “C:\Users\lextm\AppData\Local\Temp\2\tmpFD6D.tmp”中的tmp文件总是可以更改。如何添加LAUNCHER_ARGS作为环境变量,即使tmp文件发生变化也能使其工作?

让我知道是否有更简单的方法来启动IIS Express以使用命令行或PowerShell脚本运行ASP.NET Core Apps。

3 个答案:

答案 0 :(得分:4)

您正在寻找[System.IO.Path]::GetTempFileName()方法。它在文件系统上创建空的临时文件并返回其唯一名称。

我目前正在使用以下PowerShell脚本来运行我的.NET Core 2.0应用程序:

$env:LAUNCHER_ARGS = "-p ""<path to dotnet.exe>"" -a ""exec \""<path to webapp main dll>\"""" -pidFile $([System.IO.Path]::GetTempFileName()) -wd ""<path to webapp root folder>"" -pr <project name>"
$env:LAUNCHER_PATH = "<path to VSIISExeLauncher.exe>"
& "<path to iisexpress.exe>" /config:"<path to applicationhost.config>" /site:"<webapp name>"

占位符(尖括号内的文本)必须填充相应的值。您可以通过从Visual Studio运行项目并使用Process Explorer检查iisexpress.exe进程的环境变量来查找它们,如上面链接中所示。

答案 1 :(得分:0)

在.NET Core 3中,此问题的解决方案已更改。请按照下列步骤。

1)现在环境变量应为:

    LAUNCHER_ARGS=exec "C:\YourWebApiProject\bin\Debug\netcoreapp3.1\YourWebApiProject.dll"
    LAUNCHER_PATH=C:\Program Files\dotnet\dotnet.exe

请注意依赖于.NET版本(在这种情况下为netcoreapp3.1)的dll的路径。此外,不再需要创建临时文件。

2),确保两个模块AspNetCoreModule和AspNetCoreModuleV2均在.vs\{solution name}\config\applicationhost.config中注册,如下所示:

<system.webServer> <globalModules> 下添加:

    <add name="AspNetCoreModule" image="%IIS_BIN%\aspnetcore.dll" />
    <add name="AspNetCoreModuleV2" image="%IIS_BIN%\Asp.Net Core Module\V2\aspnetcorev2.dll" />

<sectionGroup name="system.webServer"> 下添加:

    <section name="aspNetCore" overrideModeDefault="Allow" />

<location path="" overrideMode="Allow"> <system.webServer> <modules> 下添加:

    <add name="AspNetCoreModule" lockItem="true" />
    <add name="AspNetCoreModuleV2" lockItem="true" />

%PROGRAMFILES%\IIS Express\config\templates\PersonalWebServer\applicationhost.config%PROGRAMFILES(x86)%\IIS Express\config\templates\PersonalWebServer\applicationhost.config上的该文件的模板进行此更改也是一个好主意,因此您不必为每个VS解决方案都重复此步骤。 (贷记this post

3)请注意您使用的是32位还是64位IIS Express。 (假设您使用的是64位计算机,则32位IIS Express = C:\ Program Files(x86)\ IIS Express,64位= C:\ Program Files \ IIS Express)在我的情况下,32位以前可以正常工作但是在迁移到.NET Core 3之后,我不得不使用64位,否则上述模块将无法加载。

答案 2 :(得分:0)

我需要一次轻松地运行多个.Net Core API终结点,而不必为每个终结点弹出打开的Visual Studio。我最终在这里使用答案来构建以下内容:

iisaspnet.bat:

@echo off
:: Args are like:
:: MobileApi
:: C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src\HCPMobileApi
:: MobileApi\bin\Debug\netcoreapp2.2\MobileApi.dll
:: .vs\MobileApp\config\applicationhost.config
setlocal
set PATH=%PATH%;C:\Program Files\IIS Express
set LAUNCHER_ARGS=exec %2\%3
set LAUNCHER_PATH=C:\Program Files\dotnet\dotnet.exe
iisexpress /site:%1 /config:"%2\%4"
:: Comment out line below to check for errors
exit

第一个arg是项目的名称-Visual Studio中的名称(在某些情况下,人们会流氓并以自己的名字命名他们的Project文件,而项目本身则是另一件事-您想要的是Project名称,而不是文件名,在这种情况下)。

第二个arg是第三个和第四个args的根文件夹。

第三个arg是在哪里找到已编译的Project DLL

第四个arg是找到applicationhost.config的位置,它解释了如何启动该站点。正如您将在下面看到的那样,通常可以在.vs文件夹中找到该文件夹​​,但是存在的位置可能会有些疯狂,具体取决于人们如何组织他们的Solution和Project文件夹。通常,.vs文件夹将与.sln文件位于同一文件夹中,因此它可能与Project文件夹/文件相去甚远。

这将不太有用,但是这是启动IIS Express窗口的批处理文件,因此您可以看到iisaspnet.bat在使用中:

start iisaspnet.bat MobileApi C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src\HCPMobileApi MobileApi\bin\Debug\netcoreapp2.2\MobileApi.dll .vs\MobileApp\config\applicationhost.config
start iisaspnet.bat HCP.MasterDataApi C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src MasterData\Api\HCP.MasterDataApi\bin\Debug\netcoreapp2.2\HCP.MasterDataApi.dll Solutions\.vs\MasterData\config\applicationhost.config
start iisaspnet.bat HCP.SecurityApi C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src Security\Api\HCP.SecurityApi\bin\Debug\netcoreapp2.2\HCP.SecurityApi.dll Solutions\.vs\Security\config\applicationhost.config
start iisaspnet.bat HCP.BillingApi C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src Billing\Api\HCP.BillingApi\bin\Debug\netcoreapp2.2\HCP.BillingApi.dll Solutions\.vs\Billing\config\applicationhost.config
start iisaspnet.bat HCP.ClientApi C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src Client\Api\HCP.ClientApi\bin\Debug\netcoreapp2.2\HCP.ClientApi.dll Solutions\.vs\Client\config\applicationhost.config
start iisaspnet.bat HCP.EmployeeApi C:\Users\chris\Dropbox\Code\2017\VbaMeasureHcp\src Employee\Api\HCP.EmployeeApi\bin\Debug\netcoreapp2.2\HCP.EmployeeApi.dll Solutions\.vs\Employee\config\applicationhost.config

如果项目,解决方案等的存储和命名方式更加一致,则参数的工作方式可能会简单得多,但是,这是我无法控制的现有解决方案集,它们的命名方式分散,并且,无论如何对于了解如何调用这些命令,上述混乱可能都更有帮助。

结果是,运行一个命令为我启动了6个IIS Express命令窗口,请求被记录到它们的每个窗口中,而我只是在每个窗口中键入Q来杀死它们。