【问题标题】:ASP.NET Core application debugging without publishing on IIS无需在 IIS 上发布的 ASP.NET Core 应用程序调试
【发布时间】:2016-08-12 04:40:47
【问题描述】:

我曾经使用 asp.net mvc4,在 IIS 中,我网站的物理路径会指向我的解决方案目录,每次更新代码时,我都会重新构建我的解决方案,然后我可以使用“附加到进程”( w3wp) 开始调试。

在 asp.net 核心中,当我将我的网站发布到文件系统时,我可以使用 IIS 和非托管代码运行我的网站。但是当我将我的 IIS 网站指向我的网站解决方案代码时,它显示 502 错误。

【问题讨论】:

  • 您不能将 IIS 指向解决方案代码,因为解决方案代码不包含要运行的 DotNet Core 的所有文件,甚至在 bin 文件夹中也不包含。当您运行 DotNet Publish 时,它会引入它需要的所有其他内容,因此您必须将已发布的站点指向 IIS。请参阅我的答案,了解使用 dotnet run 来替代此概念的工作流程。
  • 看看我的回答。

标签: asp.net asp.net-core iis


【解决方案1】:

您不需要像我们以前描述的那样在 IIS 中运行 .Net Core 来轻松调试等。

使用 .Net Core,您只需在项目根目录中打开命令行并输入“dotnet run”

DotNet Run 使用环境变量来驱动它的工作。因此,如果您希望您的网站在特定 URL 或端口上运行,请键入:

SET ASPNETCORE_URLS=http://example.com

或者如果你只是想让它在不同的端口上运行

SET ASPNETCORE_URLS=http://localhost:8080

然后设置环境

SET ASPNETCORE_ENVIRONMENT=Development

设置好所有环境变量后,输入

dotnet run

现在要对其进行调试,请附加到 cmd.exe,并在其标题中使用 dotnet run。您将能够以这种方式调试您的代码。

现在,如果您使用 Visual Studio,在您的项目的“属性”下有一个名为“launchSettings.JSON”的文件。您可以在此处配置配置文件,我将我的默认配置文件设置为 Kestrel Development,然后是 Kestrel Production,IIS 最后死机,这样我就不会在 IIS Express 中运行 F5。

我的 LaunchSettings.json 如下所示:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:56545/",
      "sslPort": 0
    }
  },
  "profiles": {
    "Kestrel Development": {
      "executablePath": "dotnet run",
      "commandName": "Project",
      "commandLineArgs": "dotnet run",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "http://localhost:8080"
      }
    },
    "Kestrel Production": {
      "commandLineArgs": "dotnet run",
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_URLS": "http://localhost:8080",
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "executablePath": "dotnet"
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

第一个配置文件是您按下 F5 时使用的配置文件。因此,当我按 F5 时,Visual Studio 会为我启动 dotnet run 并设置环境和 URL,由我在 launchSettings.JSON 中的配置文件的 environmentVariables 部分指定。

现在因为我有多个配置文件,所以我在运行按钮旁边有一个下拉菜单,因此如果我想在本地以生产模式运行,我可以选择 Kestrel Production。

【讨论】:

  • 另外值得注意的是,如果您确实在 IIS 中运行该站点,则无法实时编辑视图并刷新页面。因为 DotNet Core 发布到发布目录,而这是您必须将 IIS 指向的目录才能使站点运行。这意味着您需要编辑已发布的视图以查看实时更改。 Dotnet 运行是执行此操作的新方法。使用 dotnet run,您可以编辑视图并通过页面刷新等查看更改。
  • 如果我们需要同时运行多个项目,比如一个 web api 和一个使用该 web api 的 mvc 项目,如何使用 dotnet run 来做到这一点?
  • 回家后我会检查一下,但现在只需为每个更改为项目目录的项目创建一个批处理文件,然后将 ASPNETCORE_URLS 环境 url 设置为不同的 url,然后在批处理文件中运行“dotnet run”。只需一个接一个地运行这两个批处理文件。您将运行两个控制台窗口来分隔红隼实例。如果您需要调试一个,请附加到要调试的那个的 dotnet run 进程。要知道您可以在运行 dotnet run 后让批处理文件输出 PID。
  • 瑞恩,你有时间检查一下吗?
  • 不,我忘了。
【解决方案2】:

按照这些步骤来实现您想要的。

  1. 在launchSettings.json 中,在iisSettings 下添加一个名为iis 的属性,如下所示:

    "iis": {
      "applicationUrl": "http://my.aspnetcoreapp.com"
    }
    
  2. profiles 部分下,添加一个将commandName 设置为IIS 的新配置文件。我打电话给我的Local IIS。这将在名为 Local IIS 的“运行”下拉列表中添加一个新选项。

    "Local IIS": {
      "commandName": "IIS",
      "launchBrowser": true,
      "launchUrl": "http://my.aspnetcoreapp.com",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
    
  3. 在 IIS 中创建网站。将主机名设置为my.aspnetcoreapp.com。还为此网站创建/使用一个应用程序池,其 .NET CLR 版本设置为“无托管代码”。

  4. 将该网站的物理路径设置为您的 asp.net 核心项目的位置,而不是解决方案,当然,除非您的项目与解决方案位于同一文件夹中。
  5. 在 hosts 文件中添加一个回环条目(对于 Windows C:\Windows\System32\drivers\etc\hosts

    127.0.0.1 my.aspnetcoreapp.com

  6. 返回到 Visual Studio,然后运行应用程序。确保从“运行”下拉菜单中选择了“本地 IIS”配置文件。这将在浏览器中的 URL 处启动应用程序,并在显示 “Provisioning IIS...” 的简短加载消息之后。

  7. 完成!从现在开始,您可以在该 URL 启动您的应用程序,也可以通过附加到进程 w3wp 进行调试。

您还可以在 “默认网站” 下托管您的应用,方法是指定 localhost/MyAspNetCoreApp 之类的 ULR,而不是 my.aspnetcoreapp.com。如果这样做,将创建一个名为 MyAspNetCoreApp AppPool 的新应用程序池。

My medium article 关于这个。

【讨论】:

  • 简单而有效。谢谢!
【解决方案3】:

简单回答:当您发布时,您调用一个脚本来启动publish-iis 工具(参见project.json 中的script 部分)。


在您的项目中,您有一个 web.config 文件,内容如下:

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" 
 stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/

如您所见,有占位符"%LAUNCHER_PATH%"%LAUNCHER_ARGS% 参数。请记住这些。

现在打开您的 project.json 文件,您将看到一个“脚本”部分,如下所示:

"scripts":
{  
    "postpublish":"dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"
}

它告诉 dotnet 在应用程序发布后运行 publish-iis 工具。 How it works:

publish-iis 工具会转到发布应用程序的文件夹(不是您的项目文件夹)并检查它是否包含 web.config 文件。如果没有,它将创建一个。如果是,它将检查您拥有的应用程序类型(即,它是针对完整 CLR 还是 Core CLR 以及 - 对于 Core CLR - 它是可移植应用程序还是独立应用程序),并将设置 processPath 和 arguments 属性的值在途中删除 %LAUNCHER_PATH% 和 %LAUNCHER_ARGS% 占位符。

【讨论】:

【解决方案4】:

只需运行Ctrl + F5,您就可以在运行站点时更改代码,而无需重新启动它。

【讨论】:

  • 如果您想在终端中快速运行控制台应用程序,非常有用的答案。谢谢。
猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 2016-07-17
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多