为什么我需要在Startup Configure中的UseSpa之前调用UseSignalR

时间:2019-03-17 11:20:51

标签: asp.net-core signalr single-page-application

在使用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 => 
    { 
        ... 
    });

1 个答案:

答案 0 :(得分:1)

如果您为SpaApplicationBuilderExtensions.UseSpa read the documentation,您会清楚地看到:

  

通过以下方式处理中间件链中此刻的所有请求   返回单页应用程序(SPA)的默认页面。

     

此中间件应放在链的末尾,以便其他   用于提供静态文件,MVC操作等的中间件   优先。

因此,SpaMiddleware会捕获到达该管道点的每个请求,并尝试将其作为对SPA主页(Angular / React / other)的请求进行处理。

顺序始终非常重要:ASP.NET Core使用管道,因此您放入该管道的每个中间件都将按顺序执行。如果中间件在不调用管道其余部分的情况下处理了请求,则请求在那里停止,并返回响应。