如果 UseSpaStaticFiles() 应该为 Angular 页面提供服务,为什么仍然需要 UseSpa() ?

2023-12-09

我在这里阅读了一些文章/博客文章和问题,但我仍然对 的用法感到困惑UseSpaStaticFiles() and UseSpa()ASP.NET Core 2.1 中的中间件。 (参考:ASP.NET Core 2.1 中的 UseStaticFiles、UseSpaStaticFiles 和 UseSpa 之间有什么区别? https://blog.steadycoding.com/usedefaultfiles-usestaticfiles-usespastaticfiles-usespa/)

我将 Angular 项目模板与 ASP.NET Core 2.1 一起使用,该模板附带了一组预定义的中间件,添加到了管道中Startup.cs file:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSpaStaticFiles(configuration =>
               {
                   configuration.RootPath = "ClientApp/dist";
               });      
}

public void Configure(IApplicationBuilder app)
{   

    app.UseStaticFiles();
    app.UseSpaStaticFiles();

   
    app.UseSpa(spa =>
    {
        if (env.IsDevelopment())
        {
            spa.UseProxyToSpaDevelopmentServer("http://localhost:4000");
        }
    });
    
}

我的困惑如下: Angular项目是外部编译的,编译后的js文件位于ClientApp/dist文件夹中,环境也设置为生产,所以我假设UseSpaStaticFiles()将为 Angular 页面提供服务ClientApp/dist文件夹中有适当的内容。另外,UseSpa()中间件在这种情况下毫无用处,因此我可以删除该中间件。

然而,如果UseSpa()被删除后,Angular 页面根本就没有加载,尽管事实上UseSpaStaticFiles()应根据内容提供页面ClientApp/dist。 (如果UseSpaStaticFiles() and UseSpa()两者都添加到中间件管道中,Angular 页面已成功从ClientApp/dist文件夹,这意味着UseSpaStaticFiles()服务它。)

如果环境设置为生产环境,UseSpa()根本没有配置,它只是添加到中间件管道中。

你能帮我解释一下为什么UseSpaStaticFiles()如果没有,则无法提供页面UseSpa()以及为什么UseSpa()即使它不提供任何服务,也应该始终添加到管道中吗?我的配置中是否遗漏了导致此行为的某些内容?


The UseSpa本质上是一个包罗万象的路由处理程序,它将所有以前未处理的路由转发到您的单页应用程序。这样,您的 SPA 就可以执行客户端路由之类的操作,而无需服务器应用程序知道客户端应用程序能够理解的所有路由。

相比之下,UseSpaStaticFiles是一个静态文件处理程序,仅提供已编译的应用程序文件,例如应用程序包如app.js or vendor.js,在各自的名字下,就像UseStaticFiles适用于静态文件wwwroot folder.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 UseSpaStaticFiles() 应该为 Angular 页面提供服务,为什么仍然需要 UseSpa() ? 的相关文章

  • 如何在 Angular 4 项目中使用 ActiveXObject

    我正在尝试使用 ActiveXObject 如下所示 getActiveXObject pdfCtrl return new ActiveXObject pdfCtrl checkPDF let plugin null if this ge
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • Angular 4 与 Webpack 2,动态加载脚本

    我刚刚在一个项目中尝试使用 Angular 4 和 Webpack 2 我试图在 ngOnInit 期间加载一些脚本 但遇到了一些问题 问题1 我的 ngOnInit 中有以下代码 System import node modules jq
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • ng-cli 6 和 font Awesome 图标不起作用

    我正在使用 font awesome 4 70 Angular 6 0 8 和 cli 6 0 8 完整版本如下 我正在尝试用 cli 的 ng build 替换我们现有的 webpack 进程 我遇到了 font Awesome 图标未显
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 无法在 Cron 中运行 Python 脚本

    我有一个简单的 Python 脚本 我试图将其设置为 cron 作业 但它拒绝运行 当我单独运行它时 它确实会运行 并将其称为 python script py 我尝试在 crontab 中设置环境变量 但无法让它工作 我的 crontab
  • C 位标志枚举应如何转换为 C++?

    C 大部分是 C 的超集 但并非总是如此 特别是 虽然 C 和 C 中的枚举值都隐式转换为 int 但反之则不然 只有在 C 中 int 才会转换回枚举值 因此 通过枚举声明定义的位标志无法正常工作 因此 这在 C 中是可以的 但在 C 中
  • 在 PDF 页面上运行 Chrome 插件

    使用 Chrome 扩展程序 我想 检测当前选项卡是否已加载 PDF 文件 向 popup html 添加一个按钮以提供将 PDF 转换为 HTML5 的功能 获取 PDF 文件的 URL 并将其发送到在线服务 为了实现 1 我认为本页上的
  • Javascript:无法使用 getElementById 获取元素[重复]

    这个问题在这里已经有答案了 好的 我需要新的眼光 因为我还在这个问题上待了一个小时 这是我的简单 HTML 代码 testssio html 其中包含 javascript 脚本 div div 但这不起作用 使用调试器 我得到
  • 在 Android 中按下按钮时增加按钮的大小

    如何使按钮的大小在按下时稍微增大并在释放时再次减小 这是为了通过使用尺寸和不同的颜色来突出显示按下的按钮 问候 琪琪 做你的Button一个字段 并修改其大小OnTouchListener与之相关 使用 OnTouchListener 你可
  • Doctrine DQL 条件查询

    我正在尝试使用 Doctrine 的查询生成器构建动态查询 假设我还想在下面选择一个结束时间 仅当输入一个结束时间时 我如何有条件地将其添加到声明中 query this gt getEntityManager gt createQuery
  • Excel VBA - 如果单元格是整数,则删除整行

    我一直在尝试使用一些关于如何删除 Excel VBA 上的整行的代码片段 但我无法修改它们以包含 IsNumber 验证 我需要能够选择一个活动区域 例如 Set r ActiveSheet Range A1 C10 当它逐行浏览时 并检查
  • 脚本每 24 小时重新启动一次 Heroku [重复]

    这个问题在这里已经有答案了 我有一个 Python 中的 Telegram 机器人 但它大约每 24 小时在工作线程中通过相同的命令重新启动一次 我正在使用免费版本的 dynohours 如何禁用此重新启动 你不能 您必须设计您的应用程序
  • ruby on Rails f.select 具有自定义属性的选项

    我有一个表单选择语句 如下所示 f select country id countries map c c name c id 这段代码的结果是
  • 在快照侦听器中添加一个新文档时,Firestore 文档读取成本

    我有一个文档侦听器 可以侦听与此类似的前 25 个文档 db collection cities whereField state isEqualTo CA limit to 25 addSnapshotListener querySnap
  • 使用 Selenium WebDriver 和 Java Robot 类上传文件

    我正在使用 Selenium WebDriver 和 Java 我需要自动化文件上传功能 我尝试了很多 但是当单击 浏览 按钮并打开一个新窗口时 脚本会停止进一步执行 并且会卡住 我尝试了 FireFox 和 IE 驱动程序 但没有成功 我
  • 一次检查所有 $_POST 变量

    有没有办法一次检查一个表单中的所有帖子变量 以至少验证它们不为空 例如 if isset ALL POST echo one of your fields is not completed 您可以创建一个必填字段的数组并循环遍历该数组 re
  • Kendo Grid 外键列动态绑定

    Html Kendo Grid IEnumerable
  • 如何检测手机是否连接android auto

    我正在开发一个音频播放器应用程序 我需要确定用户的设备何时连接到 Android Auto 该应用程序具有警报功能 我想确保它不会在用户开车时响起 确定我的音乐服务是否 MediaBrowserService 有效 我可以在 onCreat
  • 方言错误消息流口水

    我已经在 Tomcat 7 中部署了一个 webApp 我正在使用 Drools 现在 当我连续运行时 Drools 会抛出运行时异常 我也在类路径中添加了 core 3 4 2 v 883 R34x jar 请查找错误日志 Some er
  • C#串行端口监听器[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在 C 中是否有任何串行端口侦听器 如果串行端口上有任何数据 它将调用我的函数 我唯一的想法是使用无限循环 如下所示 while true if someDataOnSerial
  • 用于选择单选按钮的greasemonkey脚本

    我是新来的 我有一个关于油脂猴的问题 一个页面包含多个单选按钮值 需要做出一个选择 这个正确的选择选项隐藏在页面中 单选按钮以结构如下的形式出现
  • 如何强制 npm 不创建本地包的符号链接?

    我下载了 npm 包的本地副本并将其解压到桌面上 然后我用了npm install directory 安装它 我注意到 当我删除桌面目录时 应用程序说它找不到已安装的模块 经过进一步调查 我注意到包裹在node modules但它旁边有箭
  • ag-grid API 在 Angular 单元测试中未定义

    我正在以角度编写 Ag grid 的单元测试用例 测试 组件 ts public gridApi GridApi public gridColumnApi constructor private service Service this i
  • 如果 UseSpaStaticFiles() 应该为 Angular 页面提供服务,为什么仍然需要 UseSpa() ?

    我在这里阅读了一些文章 博客文章和问题 但我仍然对 的用法感到困惑UseSpaStaticFiles and UseSpa ASP NET Core 2 1 中的中间件 参考 ASP NET Core 2 1 中的 UseStaticFil