在.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中托管SPA应用

一个文件搞定Asp.net core 3.1动态页面转静态页面

当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由

.Net Core ConfigureAppConfiguration 添加额外的源覆盖环境特定设置

使用自包含框架时,dot net core 3.1 的设置 CI 构建配置失败