如何在不发布应用程序的情况下在 IIS 上 运行 ASP.NET MVC6
How to run ASP.NET MVC6 on IIS without publishing application
我正在尝试找到一种方法 运行 IIS 上的 MVC6 应用程序,但实际上没有进行发布。我不确定这是否可能,如果不可能,将来是否可能?
我希望在以前的版本中有类似的行为,在应用程序在 IIS 下 运行ning 时,我可以轻松地调试我的代码并进行更改。
有可能。在项目的根目录下(project.json 目录),运行 以下命令:
dnu publish --runtime active --out bin/artifacts
发布完成后,bin/artifacts
文件夹下就会有一些东西。将 IIS 应用程序池指向我们刚刚创建的 bin/artifacts/wwwroot
文件夹,它应该可以工作。请记住,您至少需要 .NET 4.5.1。
从你原来的问题(强调):
I am trying to find a way to run MVC6 application on IIS but without actually doing the publish.
来自您对 tugberk 的评论(已强调):
Right now every time when I make a change I need to call that dnu publish command in order to see my changes on IIS. I would like to see them only by doing rebuild.
答案及原因
您需要发布。至少有两个原因:
- IIS 需要构建输出和
- IIS 需要一个 web.config 文件。
IIS 可能还需要其他一些我不知道的东西。所以,你需要发布。这没什么大不了的:在一次性设置之后,发布不会比重建花费更长的时间。
为什么要发布?
在Visual Studio 2015 年,如果您构建一个ASP.NET 5 web 应用程序,您的解决方案目录下将没有构建输出,而IIS 需要构建输出。 By default Roslyn 只有 运行 的代码分析,不会发出构建输出。
您可以更改该默认值,以便 Roslyn 发出构建输出,但不会生成 IIS 需要的 web.config 文件。通过转至 View
> Project Properties
> Build
并选中 "Produce outputs on build",Roslyn 会将输出发送到 artifacts
目录。例如:
artifacts/bin/MyWebApp/Debug/MyWebApp.1.0.0.nupkg
artifacts/bin/MyWebApp/Debug/MyWebApp.1.0.0.symbols.nupkg
artifacts/bin/MyWebApp/Debug/app/project.json
artifacts/bin/MyWebApp/Debug/dnx451/MyWebApp.dll
artifacts/bin/MyWebApp/Debug/dnx451/MyWebApp.pdb
artifacts/bin/MyWebApp/Debug/dnx451/MyWebApp.xml
artifacts/bin/MyWebApp/Debug/dnxcore50/MyWebApp.dll
artifacts/bin/MyWebApp/Debug/dnxcore50/MyWebApp.pdb
artifacts/bin/MyWebApp/Debug/dnxcore50/MyWebApp.xml
如果您将 IIS 指向 artifacts
目录,您现在会遇到既没有 wwwroot
也没有 web.config
的问题。
因此,您需要发布(或制定一些其他复杂的解决方案)IIS 才能与 ASP.NET 一起工作 5. 如果您想从 Visual Studio 发布到本地 IIS 网站。完成一次性设置后,您可以更改代码并单击两次即可发布。这是一次性设置:
- 右键单击该项目。
- 选择发布。
- Select 文件系统并添加配置文件名称(例如 inetpub)。
- 将目标位置更改为 C:\inetpub\MyWebApp
- 在设置中,select适当的设置。例如。
- 配置:调试
- 目标 DNX 版本:
dnx-clr-win-x64.1.0.0-beta4
- 点击发布。
发布完成后,将 IIS 指向 C:\inetpub\MyWebApp\wwwroot
,您将能够浏览该网站。更重要的是,您现在可以更改您的代码,单击两次即可发布,并刷新您的 IIS 站点以查看更改。
一些陷阱
如果您确实选择发布到inetpub
,请务必运行Visual Studio作为管理员,以免收到权限不足的错误。
如果您接受默认发布位置(而不是使用上面显示的 inetpub),请注意路径太长错误(即 > 260 个字符。)
最后的想法
为什么不在开发过程中使用 Visual Studio 和 Debug
> Start without debugging
。使用 Roslyn 和 Visual Studio 2015,您可以对代码 进行更改 并通过 刷新网络浏览器 查看这些更改。无需重建。这是一个更好的工作流程。
我假设这是关于 IIS 问题的开发。这是可行的,但需要一些工作。 IIS 在没有发布的情况下无法开箱即用的原因是因为默认情况下在应用程序池上没有用户配置文件设置。您可以做的最简单的事情是在应用程序池上启用用户配置文件,这将允许 IIS 在用户配置文件文件夹中找到运行时。最重要的是,您需要一个 web.config 来指定要使用的运行时版本(dnu publish 会为您生成它,因此如果您愿意,您可以进行发布并复制运行时文件夹)。这样做之后,将 IIS 指向 wwwroot 应该就可以了(假设您设置了正确的 web.config 具有正确的运行时和正确的位数)。
您还需要 bin 文件夹中的正确 AspNet.Loader.dll。如果您使用 visual studio,它将复制到正确的位置。
基于 davidfowl 回答我 运行 ASP.NET IIS 上的 MVC6,无需发布应用程序。但是我仍然无法通过 F5 开始调试它(只能通过附加到 w3wp.exe)。
无论如何,我希望它会有所帮助:
- 在项目的根目录中添加"packages"目录(或任意命名)。
- 在 global.json 文件中添加 "packages": "packages"。例如:
{
"projects": [
"src",
"test",
"wrap"
],
"sdk": {
"version": "1.0.0-beta4"
},
"packages": "packages" // <--
}
包现在将存储在此目录中。
- 在项目的根目录中创建一个 "runtimes" 目录。
- 将运行时从 %userprofile%/.dnx/runtimes 复制到 /path/to/your/project/runtimes
- 在您项目的 wwwroot 中创建一个 web.config。例如:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="bootstrapper-version" value="1.0.0-beta4" />
<add key="dnx-version" value="1.0.0-beta4" />
<add key="dnx-clr" value="clr" />
<add key="dnx-app-base" value=".." />
<add key="runtime-path" value="../../../runtimes" />
</appSettings>
</configuration>
- 在 IIS 中创建 Web 应用程序并将其指向您的项目 wwwroot。
我的项目目录结构:
Projects/
vNext/
packages/
runtimes/
dnx-clr-win-x64.1.0.0-beta4/
dnx-clr-win-x86.1.0.0-beta4/
...
src/
vNext/
wwwroot/ <-- IIS web application points here
web.config
...
project.json
...
global.json
vNext.sln
...
之后您将能够附加到 w3wp.exe 并在 IIS 下调试您的应用程序 运行。
我正在尝试找到一种方法 运行 IIS 上的 MVC6 应用程序,但实际上没有进行发布。我不确定这是否可能,如果不可能,将来是否可能?
我希望在以前的版本中有类似的行为,在应用程序在 IIS 下 运行ning 时,我可以轻松地调试我的代码并进行更改。
有可能。在项目的根目录下(project.json 目录),运行 以下命令:
dnu publish --runtime active --out bin/artifacts
发布完成后,bin/artifacts
文件夹下就会有一些东西。将 IIS 应用程序池指向我们刚刚创建的 bin/artifacts/wwwroot
文件夹,它应该可以工作。请记住,您至少需要 .NET 4.5.1。
从你原来的问题(强调):
I am trying to find a way to run MVC6 application on IIS but without actually doing the publish.
来自您对 tugberk 的评论(已强调):
Right now every time when I make a change I need to call that dnu publish command in order to see my changes on IIS. I would like to see them only by doing rebuild.
答案及原因
您需要发布。至少有两个原因:
- IIS 需要构建输出和
- IIS 需要一个 web.config 文件。
IIS 可能还需要其他一些我不知道的东西。所以,你需要发布。这没什么大不了的:在一次性设置之后,发布不会比重建花费更长的时间。
为什么要发布?
在Visual Studio 2015 年,如果您构建一个ASP.NET 5 web 应用程序,您的解决方案目录下将没有构建输出,而IIS 需要构建输出。 By default Roslyn 只有 运行 的代码分析,不会发出构建输出。
您可以更改该默认值,以便 Roslyn 发出构建输出,但不会生成 IIS 需要的 web.config 文件。通过转至 View
> Project Properties
> Build
并选中 "Produce outputs on build",Roslyn 会将输出发送到 artifacts
目录。例如:
artifacts/bin/MyWebApp/Debug/MyWebApp.1.0.0.nupkg
artifacts/bin/MyWebApp/Debug/MyWebApp.1.0.0.symbols.nupkg
artifacts/bin/MyWebApp/Debug/app/project.json
artifacts/bin/MyWebApp/Debug/dnx451/MyWebApp.dll
artifacts/bin/MyWebApp/Debug/dnx451/MyWebApp.pdb
artifacts/bin/MyWebApp/Debug/dnx451/MyWebApp.xml
artifacts/bin/MyWebApp/Debug/dnxcore50/MyWebApp.dll
artifacts/bin/MyWebApp/Debug/dnxcore50/MyWebApp.pdb
artifacts/bin/MyWebApp/Debug/dnxcore50/MyWebApp.xml
如果您将 IIS 指向 artifacts
目录,您现在会遇到既没有 wwwroot
也没有 web.config
的问题。
因此,您需要发布(或制定一些其他复杂的解决方案)IIS 才能与 ASP.NET 一起工作 5. 如果您想从 Visual Studio 发布到本地 IIS 网站。完成一次性设置后,您可以更改代码并单击两次即可发布。这是一次性设置:
- 右键单击该项目。
- 选择发布。
- Select 文件系统并添加配置文件名称(例如 inetpub)。
- 将目标位置更改为 C:\inetpub\MyWebApp
- 在设置中,select适当的设置。例如。
- 配置:调试
- 目标 DNX 版本:
dnx-clr-win-x64.1.0.0-beta4
- 点击发布。
发布完成后,将 IIS 指向 C:\inetpub\MyWebApp\wwwroot
,您将能够浏览该网站。更重要的是,您现在可以更改您的代码,单击两次即可发布,并刷新您的 IIS 站点以查看更改。
一些陷阱
如果您确实选择发布到
inetpub
,请务必运行Visual Studio作为管理员,以免收到权限不足的错误。如果您接受默认发布位置(而不是使用上面显示的 inetpub),请注意路径太长错误(即 > 260 个字符。)
最后的想法
为什么不在开发过程中使用 Visual Studio 和 Debug
> Start without debugging
。使用 Roslyn 和 Visual Studio 2015,您可以对代码 进行更改 并通过 刷新网络浏览器 查看这些更改。无需重建。这是一个更好的工作流程。
我假设这是关于 IIS 问题的开发。这是可行的,但需要一些工作。 IIS 在没有发布的情况下无法开箱即用的原因是因为默认情况下在应用程序池上没有用户配置文件设置。您可以做的最简单的事情是在应用程序池上启用用户配置文件,这将允许 IIS 在用户配置文件文件夹中找到运行时。最重要的是,您需要一个 web.config 来指定要使用的运行时版本(dnu publish 会为您生成它,因此如果您愿意,您可以进行发布并复制运行时文件夹)。这样做之后,将 IIS 指向 wwwroot 应该就可以了(假设您设置了正确的 web.config 具有正确的运行时和正确的位数)。
您还需要 bin 文件夹中的正确 AspNet.Loader.dll。如果您使用 visual studio,它将复制到正确的位置。
基于 davidfowl 回答我 运行 ASP.NET IIS 上的 MVC6,无需发布应用程序。但是我仍然无法通过 F5 开始调试它(只能通过附加到 w3wp.exe)。
无论如何,我希望它会有所帮助:
- 在项目的根目录中添加"packages"目录(或任意命名)。
- 在 global.json 文件中添加 "packages": "packages"。例如:
{
"projects": [
"src",
"test",
"wrap"
],
"sdk": {
"version": "1.0.0-beta4"
},
"packages": "packages" // <--
}
包现在将存储在此目录中。
- 在项目的根目录中创建一个 "runtimes" 目录。
- 将运行时从 %userprofile%/.dnx/runtimes 复制到 /path/to/your/project/runtimes
- 在您项目的 wwwroot 中创建一个 web.config。例如:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="bootstrapper-version" value="1.0.0-beta4" />
<add key="dnx-version" value="1.0.0-beta4" />
<add key="dnx-clr" value="clr" />
<add key="dnx-app-base" value=".." />
<add key="runtime-path" value="../../../runtimes" />
</appSettings>
</configuration>
- 在 IIS 中创建 Web 应用程序并将其指向您的项目 wwwroot。
我的项目目录结构:
Projects/
vNext/
packages/
runtimes/
dnx-clr-win-x64.1.0.0-beta4/
dnx-clr-win-x86.1.0.0-beta4/
...
src/
vNext/
wwwroot/ <-- IIS web application points here
web.config
...
project.json
...
global.json
vNext.sln
...
之后您将能够附加到 w3wp.exe 并在 IIS 下调试您的应用程序 运行。