作为背景
我写了一个.NET核心2.2/角7应用程序一段时间,与HMR设置和工作。我想用DevTools插件来分析这个应用程序,为了做到这一点,我需要升级到角形9。
问题是,这破坏了我的HMR配置。HMR被激活,并在进行更改时有效地重新加载页面(差异在DevTools中看起来甚至是正确的),但并没有反映到应用程序中。
我读到了与常春藤角9下降的HMR支持,并再次激活在V11上。所以我更新到角11,仍然没有HMR,它现在甚至完全崩溃,不再重新加载,sockjs节点调用面临404错误。
再次,我读到HMR支持在V12上有了很大的改进,所以,我再次更新到V12,但是没有改进HMR。
实现细节
角度应用程序由.NET Core使用spa.UseAngularCliServer(npmScript: "hmr"); (在开发中)提供服务。该应用程序分为两个部分,一个是在ASP.NET MVC中,另一个是实际的角度应用程序,在一个特殊的虚拟子文件夹/app上,使用以下方法捕获:
app.Map("/app", angular =>
{
angular.UseHttpsRedirection();
angular.UseSpaStaticFiles();
angular.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.Options.StartupTimeout = TimeSpan.FromSeconds(120);
spa.UseAngularCliServer(npmScript: "hmr");
}
});
});我的HMR脚本是"hmr": "ng serve --configuration hmr",HMR配置如下:
"hmr": {
"hmr": true,
"browserTarget": "ClientApp:build:hmr",
"publicHost": "https://localhost.com:44369/app",
"servePath": "/"
}所以,当sockjs试图到达https://localhost.com:44369/sockjs-node/info?t=xxxxx时
显然,
publicHost选项,而V7.的情况并非如此。
我也尝试过使用同样的结果的启动脚本"hmr": "ng serve --hmr" (在这种情况下,hmr怎么知道publicHost选项呢?)
如何正确地设置我的publicHost选项?
编辑
作为解决办法,我尝试添加一个MVC操作来捕获/sockjs-node/...请求并将它们重定向到/app/sockjs-node/...,但不幸的是,这并不适用于websocket 1.
编辑2
好吧好吧..。我的错误..。
由于sockjs是对websocket的填充,即使websocket不起作用,它也将被另一个普通的http方法所模仿。因此,即使websocket连接失败,此方法(虽然并不完美)也能工作。看看我的答案。
发布于 2022-02-13 14:21:05
它看起来像,不像以前,角发送所有的websocket请求到根目录。
到目前为止,我为这个问题找到的唯一解决办法是使用MVC操作将所有/sockjs-node/...请求重定向到它们正确的/app/sockjs-node/...表单。这不会重定向websocket调用,但是sockjs会将其填充到http请求中。
因此,我在我的一个控制器中添加了这个操作:
/// <summary>Redirects sockjs-node requests to the app subdirectory to fix HMR issues</summary>
[HttpGet("/sockjs-node/{**path}")]
[HttpPost("/sockjs-node/{**path}")]
public IActionResult AngularHmr(string path)
{
return RedirectPermanentPreserveMethod("/app/sockjs-node/" + path);
}这个解决方案远非理想,但这只是为了发展,所以这不是什么大问题.
https://stackoverflow.com/questions/71092960
复制相似问题