在.Net Core 3.1中动态设置SPA源路径
Posted
技术标签:
【中文标题】在.Net Core 3.1中动态设置SPA源路径【英文标题】:Dynamically setting the SPA source path in .Net Core 3.1 【发布时间】:2022-01-02 07:14:39 【问题描述】:我有一个 .Net Core 3.1 应用程序,用作 API,但它也为我的 SPA (Angular) 服务。最近我在 SEO 方面遇到了一些问题,所以我想在 Googlebot 出现时提供我的 Angular 应用程序的静态版本。
这里有没有办法动态设置SPA源路径?
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseSpa(spa =>
spa.Options.SourcePath = "ClientApp";
);
目前我有一个小的中间件文件,我根据 UserAgent 字符串检测 Googlebot。然后我通过请求传递它。
public async Task InvokeAsync(HttpContext context)
var userAgent = context.Request.Headers["User-Agent"];
context.Items["isCrawler"] = userAgent.Contains("Googlebot");
await _next(context);
但我无法访问 Startup.cs 文件中 Configure() 方法中的请求。无论如何我怎么能做到这一点?我真的希望能够动态设置 SourcePath。
非常感谢!
问候
【问题讨论】:
【参考方案1】:你可以试试下面的代码,把中间件放在Configure()方法中。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.Use(async (context, next) =>
var userAgent = context.Request.Headers["User-Agent"];
context.Items["isCrawler"] = userAgent.Contains("Googlebot");
if ((bool)context.Items["isCrawler"])
app.UseSpa(spa =>
spa.Options.SourcePath = "ClientApp";
);
else
//do your stufff....
// Call the next delegate/middleware in the pipeline
await next();
);
…
【讨论】:
我使用中间件类来获取请求,以便确定用户代理。我还没有找到如何在中间件类中设置应用程序 spa 设置,这将解决我的问题! 是的,你是对的。我知道您已经使用中间件类来获取请求。我的意思是你可以尝试将中间件放在Configure()方法中,就像文档中的示例代码用于演示创建中间件组件一样。然后,您无需在中间件类中设置应用程序 spa 设置。当然,在中间件类中设置 app spa 设置是另一种方式。 遗憾的是我无法让它工作。一旦我将该代码移动到中间件中,它就会中断。在 Startup 类中处理 Configure 方法时,有什么方法可以检查请求吗? 我编辑我的答案,希望它可以帮助你。 是的!它正朝着正确的方向前进!使用条件中间件应该可以解决问题(App.UseWhen)。但是在 ConfigureServices 方法中还有一些东西正在设置根路径(AddSpaStaticFiles),这可能是导致它无法正常工作的原因。以上是关于在.Net Core 3.1中动态设置SPA源路径的主要内容,如果未能解决你的问题,请参考以下文章
。NET Core 3.1 gRPC Docker:无法使原型路径相对
一个文件搞定Asp.net core 3.1动态页面转静态页面
当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由