首页 > 解决方案 > 带有 Node.js 的 ASP.NET Core 2.2 应用程序在 VS 更新后中断

问题描述

注意:有趣的部分在下面的 [Edit 10/22/2020] 下,介绍只是我感到困惑。

我认为这是对 16.8.0 Preview 4.0 的 VS 更新。我很清楚 .NET Core 2.2 已被弃用,不再受支持。我想了解发生了什么。

我们继承了一个 Web 应用程序,该应用程序应该是带有 MVC 的 ASP.NET Core,但看起来它对该基础架构没有太多作用,而是严重依赖 Node.js。这是webpack.config.js

const path = require('path');

module.exports = {
    entry: {
        main: './ClientApp/index.js'
    },
    devtool: 'inline-source-map',
    stats: { modules: false },
    devServer: {
        hot: false
    },
    watchOptions: {
        ignored: /node_modules/
    },
    output: {
        path: path.join(__dirname, '/wwwroot/js/'),
        filename: 'site.js',
        publicPath: '/'
    }
};

声明了一个入口点 ./ClientApp/index.js,直到最近,这似乎确实是在使用 IIS Express 和 Chrome 在 Visual Studio 中启动应用程序时执行的。

但是,自从我更新以来,我得到Index.cshtml了。这正是我对带有 MVC 的 ASP.NET 应用程序的期望。

我注意到的一件值得注意的事情是,在依赖项下,我不再看到曾经存在的 any/npm 分支。

我仍在使用 Visual Studio 2019 稳定版的同事仍然使用旧的行为,并开始使用index.js。看起来请求路由行为已经改变。

使用随后的“npm install”重新安装 dotnet SDK 2.2 和 Node.js 并不能修复它,我仍然得到默认页面Index.cshtml

问题:究竟是什么让应用程序执行index.js而不是Index.cshtmlindex.js除了webpack.config.js. _ 我希望找到以参数开头的东西node.exeindex.js或者包装它的一些语句。

我试图通过安装 NuGet 包 Node.js 和 Microsoft.AspNetCore.NodeServices 来使其正常工作,这些包以前从未出现过。但它不会恢复所需的行为。

[编辑]

看来,我为 中的主入口点输入什么并不重要webpack.config.js,它只需要符合模式,但它甚至在运行时都不会被查找。我找到了一种显示控制台以查看一些输出的方法。我摆脱了一些警告和错误,但结果仍然相同。毕竟它可能不是路由,它可能一直是同一个页面,只是现在功能失调,因此看起来非常不同。我不知道。这是控制台输出,我希望它能为更多知识渊博的人提供一些警报:

info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
      User profile is available. Using 'C:\Users\MaatM\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
Hosting environment: Development
Content root path: D:\Projects\ProjectName
Now listening on: https://localhost:5001
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.NodeServices[0]
      webpack built 33af367a37b276ede2b3 in 2029ms
info: Microsoft.AspNetCore.NodeServices[0]
      i ´¢ówdm´¢ú: Hash: 33af367a37b276ede2b3
      Version: webpack 4.29.5
      Time: 2029ms
      Built at: 2020-10-16 14:22:53
        Asset      Size  Chunks             Chunk Names
      site.js  6.71 MiB    main  [emitted]  main
      Entrypoint main = site.js
info: Microsoft.AspNetCore.NodeServices[0]
      i ´¢ówdm´¢ú: Compiled successfully.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Page: /Index'
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[3]
      Route matched with {page = "/Index"}. Executing page /Index
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[101]
      Executing handler method ProjectName.Pages.IndexModel.OnGet with arguments ((null)) - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[102]
      Executed handler method OnGet, returned result .
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[103]
      Executing an implicit handler method - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[104]
      Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult.
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[4]
      Executed page /Index in 63.434ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Page: /Index'
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 217.9321ms 200 text/html; charset=utf-8
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/css/site.css?123
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/lib/bootstrap/dist/css/bootstrap.css
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/lib/jquery/dist/jquery.js
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/js/site.js
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/lib/bootstrap/dist/js/bootstrap.bundle.js
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 31.0267ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 31.0331ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 19.6686ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 52.5483ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 52.5487ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/css/site.css?123
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 5.9602ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/lib/jquery/dist/jquery.js
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 4.1753ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/lib/bootstrap/dist/js/bootstrap.bundle.js
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 3.914ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/~/js/site.js
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 4.3371ms 404

一些令人费解的事情:我在第二个Microsoft.AspNetCore.NodeServices[0]下看到一些乱码,然后再往下一点同样的事情。在这之间它说Entrypoint main = site.js我没有声明。

[编辑 2020 年 10 月 22 日]

好。这真让人兴奋。谢谢 M Hornbacher 的评论。“到 site.js 的链接标签”不在 Index.cshtml 中,我在 _Layout.cshtml 中找到它,它看起来像这样:

<script src="~/js/site.js" asp-append-version="true"></script>

这让我觉得很奇怪。我不熟悉 ~ 语法,我想我会这样写:

<script type="text/javascript" src="/js/site.js"></script>

所以我改变了它,运行它,我得到了一些旧的期望行为!然后我寻找更多出现的 ~/ 构造,更改它们并立即获得(几乎)所有所需的行为。

显然 ~/ 的解释坏了,据我了解,这是一个 ASP.NET 的东西,它被服务器上的根路径所取代。或者,更可能的是,应用程序认为 root 发生了变化。所以现在我想知道它在哪里说什么是根?

顺便说一句,如果这很重要,我现在正在使用 Visual Studio 2019 16.8.0 Preview 5.0。该应用程序仍然是 .NET Core 2.2。

标签: javascriptasp.netnode.jsasp.net-mvc.net-core

解决方案


我想你知道这一点,但~通常代表主目录。在 linux 或 mac 上,您键入cd ~,它将带您到当前用户目录。

就像你说~的可能是特定于 ASP.net 的,我通常不会在部署到 linux 的项目上看到它,它太相对了。

也就是说,这里没有任何 C#/ASP.net 代码可供查看。如果它实际上可以在生产服务器上运行,但不能在本地运行,那么您可能会因为~现在丢失而无法在生产环境中工作。

您可能想研究 prod 是否真的需要~在路径中,如果需要,为什么。

So now I am wondering where does it say what is to be root?

基于此:

output: {
        path: path.join(__dirname, '/wwwroot/js/'),
        filename: 'site.js',
        publicPath: '/'
    }

并且 __dirname我相信可以根据它运行的文件进行更改。你的 js 文件site.js${__dirname/wwwroot/js/}

为了使它工作

<script type="text/javascript" src="/js/site.js"></script>

您的项目的根目录看起来像 ${__dirname}/wwwroot/

我还注意到您的输出中有:

Content root path: D:\Projects\ProjectName

这可能与 相同__dirname,这是一个猜测,无法根据给出的信息确定更多信息。

我很想知道周围是否有 index/server.js 文件。

以下是一些讨论确定节点应用程序根的参考资料:

从正在运行的 node.js 应用程序确定项目根目录

https://www.abeautifulsite.net/determining-your-apps-base-directory-in-nodejs


推荐阅读