javascript - 带有 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.cshtml
?index.js
除了webpack.config.js
. _ 我希望找到以参数开头的东西node.exe
,index.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。
解决方案
我想你知道这一点,但~
通常代表主目录。在 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 文件。
以下是一些讨论确定节点应用程序根的参考资料:
https://www.abeautifulsite.net/determining-your-apps-base-directory-in-nodejs
推荐阅读
- python - 通过添加新行来更新熊猫数据框 - 如何?
- powershell - 在尝试的结果PowerShell中修改foreach循环中if的结果
- angular - BrowserModule 已经加载完毕,创建懒加载模块
- python - 如何通过 matplotlib 中的鼠标单击事件更改条形图的颜色?
- python - 仅保留所有值都满足条件的组
- r - 根据特定约束计算排列
- oracle - 为什么我们必须在备份完整数据库后备份归档日志
- javascript - Vue.js 不工作表过滤单字段
- node.js - 长时间运行的 App Engine 脚本“在终止信号时退出”
- linux - 我想删除 ram 缓存,但在 ubuntu 18.04.3 Lts 64 位上出现权限被拒绝错误