调试在 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做服务器)

ASP.NET Core部署系列一:发布到IIS上

无法在 IIS Express 中运行 ASP.NET Core Web API 项目

在 IIS 上使用 .NET Core 运行 ASP.NET 5 (MVC 6)

先定一个小目标Asp.net Core 在IIS上的托管运行

IIS 10 上的 ASP.NET Core 404 错误