在使用Angular作为SPA的.Net Core Web应用程序中使用SignalR时,我遇到了一个令人沮丧的问题。在SignalR与客户端协商后,Web服务器将响应404错误。
确切的问题和解决方案在此GitHub问题中进行了描述。 https://github.com/aspnet/SignalR/issues/2528
我的问题是,为什么调用UseSignalR和UseSpa的顺序很重要? 为什么这样做有效,并且Web服务器接受SignalR客户端通信...
app.UseSignalR(routes =>
{
...
});
app.UseSpa(spa =>
{
...
});
并且此配置导致Web服务器以404响应
app.UseSpa(spa =>
{
...
});
app.UseSignalR(routes =>
{
...
});
答案 0 :(得分:1)
如果您为SpaApplicationBuilderExtensions.UseSpa
read the documentation,您会清楚地看到:
通过以下方式处理中间件链中此刻的所有请求 返回单页应用程序(SPA)的默认页面。
此中间件应放在链的末尾,以便其他 用于提供静态文件,MVC操作等的中间件 优先。
因此,SpaMiddleware
会捕获到达该管道点的每个请求,并尝试将其作为对SPA主页(Angular / React / other)的请求进行处理。
顺序始终非常重要:ASP.NET Core使用管道,因此您放入该管道的每个中间件都将按顺序执行。如果中间件在不调用管道其余部分的情况下处理了请求,则请求在那里停止,并返回响应。