调试在 IIS 中运行的 ASP.NET Core 应用程序
Posted
技术标签:
【中文标题】调试在 IIS 中运行的 ASP.NET Core 应用程序【英文标题】:Debugging ASP.NET Core applications running in IIS 【发布时间】:2016-07-17 17:35:25 【问题描述】:在 IIS 下运行时,有什么方法可以调试 ASP.NET Core Web 应用程序?
我在 IIS 下运行,因为我需要它在端口 443 上通过 SSL 可用。
【问题讨论】:
【参考方案1】:-
使用调试配置发布 Web 应用程序
按照here 的描述在 IIS 上设置网站
在浏览器中打开网站以启动 dotnet 进程
在 Visual Studio 中打开 Debug -> Attach to Process 或按 Ctrl+Alt+P
确保在“附加到”行中有“自动”或“托管(v4.6、v4.5、v4.0)”。如果没有,请按选择并选择“自动确定要调试的代码类型”
选中“显示所有用户的进程”
选择
dotnet.exe
并按附加
注意:如果您看到多个 dnx.exe 进程,请在用户名列中选择具有 IIS 用户的进程。默认为“IIS APPPOOL您的应用程序池名称”
附:如果您看到用户名为空的 dotnet 进程,请以管理员身份运行 Visual Studio
更新
对于 ASP.Net Core 1.0.0,您必须附加到“youprojectnamet.exe”。例如。如果您的项目名称为“Web”,则必须附加到“Web.exe” 您还可以在 web.config 的以下部分中找到执行者的名称
<system.webServer>
<aspNetCore processPath=".\Web.exe" />
</system.webServer>
【讨论】:
这可行,但我注意到您无法进入 dotnet 核心框架代码,甚至无法在框架的调用堆栈中看到事物的真实名称。如果有人找到某种方法,请更新此答案。 这个运气好吗?我不能让它工作吗?我发布了调试,并尝试以多种方式附加。它只是不会达到我的断点。 如何发布带有调试配置的应用程序? 右键单击项目,选择发布,在设置选项卡上选择以单词 Debug 开头的配置 感谢有关附加到 projectname.exe 的提示。这只是附加到 IISExpress.exe 的习惯。【参考方案2】:这真的有必要吗? ASP.NET Core 应用程序作为 IIS 的外部进程运行(使用 dotnet.exe),因此通过 IIS 进行调试实际上没有任何收获。后端应用程序通过纯 HTTP 获取请求。
有关实际 IIS 托管如何与 ASP.NET Core 一起工作的更多信息,您可能需要查看此博客文章: http://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS
Visual Studio 目前不支持在完整的 IIS 下进行调试,据我所知,这也不是计划中的事情。 Microsoft 确实支持使用 IIS Express 运行,您可以为 IIS Express 设置证书。
在 ASP.NET Core 项目的“调试项目”选项中,您可以启用一个 启用 SSL 选项。 IIS Express 将创建一个本地证书并让您使用 SSL 调试您的应用程序。
这种方法的好处是只需按 F5 即可工作 - 无需手动附加。
【讨论】:
它在不编译的情况下为视图启用“保存/重新加载”场景,不是吗? Visual Studio 一直支持在完整 IIS 下进行调试。 如果我需要调试来自其他机器/设备的请求怎么办? IIS Express 是否处理远程连接? Bonner - 但不是 ASP.NET Core 调试。不像 Vitaly 使用 Kestrel 的显式进程附件所概述的那样。 Lserson - IIS Express 可用于远程连接,但您必须对其进行配置并打开防火墙。有关更多信息,请参阅此博客文章:weblog.west-wind.com/posts/2016/Sep/28/… 我对 ASP .NET Core 最怀念的是 不必 必须按 CTRL+F5 来运行(或 F5 来调试)。您只需构建,导航到 localhost(或您配置的任何绑定)并运行您的代码...【参考方案3】:好处是您实际上可以使用实际主机名在外部使用该网站。想象一下,有一个 android 应用程序尝试连接到 localhost 以调试 asp.net 核心 web api 服务。除非您可以实际使用实际的物理 IP 地址并连接到在 iis 上运行的东西,否则设置起来很痛苦。就像以前那样。一切都可以完成,但这并不意味着如果它是新的,它就会自动变得更实用。没有旧的调试 iis 选项在生产力方面是一个倒退。
【讨论】:
我的用例是我正在编写一个 Alexa 服务,它通过 443 上的 https 与我的盒子通信。 我的意思是,有用的讨论,但你能说这如何回答 OP 的问题吗?【参考方案4】:刚刚浏览了历史,偶然发现了这个。 万一有人遇到这个问题……对我来说,解决方案很简单。 如果您在 .net 核心应用程序上使用身份验证,只需确保它使用 HTTP 的基本身份验证(用于调试部分)。 然后在 IIS 中简单地使用 Url Rewrite 为您的 http://localhost:someport .net 核心实例设置反向代理。 而已。问题解决了。 也许 url rewrite 很快就会支持 https,在这种情况下,使用 HTTP 的基本身份验证也可以用于调试目的。这会很棒。 但到目前为止,这个设置解决了我所有的问题。
【讨论】:
【参考方案5】:我一直在寻找一种解决方案,可以让我调试 .NET 核心子应用,同时在托管经典 ASP 代码的网站上运行。
Looooooka 的反向代理解决方案对我有用,但需要一些工作才能弄清楚。
1.) 将此行添加到 Startup.cs。
app.UsePathBase("/core"); // core is the name of my subdirectory
确保将其放在“app.UseStaticFiles();”行之前
2.) 安装“URL Rewrite v2”和“Application Request Routing”
3.) 向 IIS 网站 (/core) 添加一个文件夹,并在该文件夹中创建一个 web.config 文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="IISExpressReverseProxy" stopProcessing="true">
<match url="(.*)" />
<conditions>
</conditions>
<action type="Rewrite" url="http://localhost:1306/core/R:1" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
4.) 在 Visual Studio 中打开项目属性,然后转到调试选项卡。将“启动浏览器”网址更改为您的 IIS 网址。
【讨论】:
【参考方案6】:场景:调试在 IIS Local 上运行的 ASP.NET Core Web 应用程序。
先决条件:将“开发时 IIS 支持”添加到现有的 Visual Studio 安装中。点击下一个链接:https://blogs.msdn.microsoft.com/webdev/2017/07/13/development-time-iis-support-for-asp-net-core-applications/
1.在 Visual Studio 2017 中创建名为“MvcMovie”的“ASP.NET Core Web 应用程序”。
1.1。打开“MvcMovie”项目Properties。
1.1.2。转到“调试”选项卡并设置(如果没有):
1.1.2.1。 “简介:”“MvcMovie”。
1.1.2.2。 "启动:" "IIS"
1.1.2.3。 (选中)“启动浏览器:”“https://localhost”
1.1.2.4。 “环境变量:” |名称:“ASPNETCORE_ENVIRONMENT” |价值观:“发展”|
1.1.2.5。 “网络服务器设置”
1.1.2.5.1。 "应用网址:" "https://localhost"
1.1.2.5.2。 (选中)“启用匿名身份验证”
2。在“IIS 本地”管理器“添加网站”中,名称为“AspNetCoreMvcMovie”。
2.1。使用项目(不是解决方案)文件夹(在我们的例子中为“D:\ASP-NET-Core\ASP-NET-Core-Projects\MvcMovie\MvcMovie”)设置“物理路径”。
2.2。绑定“类型”:“https”。
2.3。 “SSL 证书”:“IIS Express 开发证书”。
2.4。点击“确定”。
2.5。进入“应用程序池”,按名称找到“AspNetCoreMvcMovie”池。
2.5.1。进入“编辑应用程序池”,将“.NET CLR 版本”设置为“无托管代码”。
2.5.2。点击“确定”。
3.设置 VS 2017 提升的权限。
3.1。如果我们有这样的消息:“Microsoft Visual Studio”:“此任务需要应用程序具有提升的权限”,请按照下一个链接中的故障排除“(方法 2)故障排除兼容性”: https://social.technet.microsoft.com/wiki/contents/articles/46441.visual-studio-2017-this-task-requires-the-application-to-have-elevated-permissions.aspx
3.2 完成此方法(方法二)后,VS-2017将启动。
3.3。使用 IIS 配置文件运行(在“调试”模式下)“MvcMovie”应用程序(设置为在 IIS Local 上运行……!!!不是 IIS Express !!!)。在我们的案例中,配置文件在“步骤 1”中设置为当前应用程序的名称(“MvcMovie”)。
3.4。等待应用程序在浏览器中运行。
3.5。关闭应用程序(关闭网络浏览器)。
3.6。转到兼容性故障排除窗口,然后单击“下一步”。
3.6.1。然后点击“->是的,为这个程序保存这些设置”。
3.6.2。在“解决问题”完成“保存设置”后,我们必须查看“故障排除已完成”窗口。在“故障排除已完成”窗口中,必须查看:“发现的问题”->“不兼容的程序”->“已修复”。然后点击“->关闭疑难解答”。
4.从 VS-2017 开始,使用 IIS 配置文件(在我们的例子中名为“MvcMovie”)再次运行(在“调试”模式下)“MvcMovie”应用程序。
【讨论】:
非常有用的答案。对于 VS2019 / ASP.NET Core 5 解决方案,我还必须安装 Development time IIS support for ASP.NET Core Applications,它似乎已经处理了自动创建 IIS Web 应用程序及其应用程序池。【参考方案7】:我想针对 IIS 运行 ASP.NET Core 2.2 Web API 项目时遇到了同样的问题。
launchsettings.json
"iisSettings":
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iis":
"applicationUrl": "http://localhost/AspNetCore22Starter",
"sslPort": 443
,
IIS
配置 https 绑定。此外,建议为 Web 应用程序定义一个特定的应用程序池,以便更容易找到附加过程
附加到进程
附加到进程 (Ctrl-Alt-P) + 找到 w3wp.exe 进程 + 选择用户名 = IIS APPPOOL\:
【讨论】:
【参考方案8】:我尝试了上述所有建议,但在我将所有缺失的元素放在一起之前没有任何效果。
在 IIS 中调试的基本部分是:
在您的开发人员上正确配置 IIS。机器 为您的 IIS 站点安装 SSL 证书 从 Visual Studio 安装程序添加 Development Time IIS 支持 至少安装 .NET Core SDK 2.2 在 Visual Studio 中设置启动配置文件以使用 IIS 启动浏览器。.NET Core 2.2 需要在 IIS 进程中运行您的站点。
这里有更多详细信息:http://intrinsicinnovation.com/Articles/2019/01/08/debugging-asp-net-core-applications-within-iis/
【讨论】:
链接很好,但答案可能需要更多信息才能独立存在。如果链接失效,MS' docs here 描述了类似的步骤。 “开发时间 IIS 支持”可能是关键搜索词组。以上是关于调试在 IIS 中运行的 ASP.NET Core 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)
无法在 IIS Express 中运行 ASP.NET Core Web API 项目
在 IIS 上使用 .NET Core 运行 ASP.NET 5 (MVC 6)