如果 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() ? 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Angular:如何动态更改 scss 变量?

    我对 scss 很陌生 所以我想知道是否可以使用组件的 Typescript 来更改 scss 变量 所以考虑一下 html div div scss thememode theme1 textcolormode nonHover colo
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 无法在 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