在使用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 =>
{
...
});
如果你read the documentation为SpaApplicationBuilderExtensions.UseSpa
,你清楚地看到:
通过返回单页应用程序(SPA)的默认页面处理中间件链中此点的所有请求。
这个中间件应放在链的后期,以便其他用于提供静态文件,MVC操作等的中间件优先。
因此,SpaMiddleware
捕获到达管道点的每个请求,并尝试将其作为对SPA主页面的请求(Angular / React / other)处理。
顺序始终非常重要:ASP.NET Core使用管道,因此您放入此管道的每个中间件都按顺序执行。如果中间件在不调用管道的剩余部分的情况下处理请求,则请求在那里停止并返回响应。