Asp.Net Core SignalR + Angular 6 issue



我有一个WebApi,它是使用Asp.net Core 2.0制作的,并将此API作为Angular 5应用程序使用。现在我正在使用Angular 6制作这个应用程序的新版本。

在这个Web API中,我使用SignalR 1.0.0-alpha-final,在Angular 5应用程序中,我将其用作客户端"@aspnet/signalr-client": "^1.0.0-alpha2-final"

在旧的Angular应用程序中,一切都能正常工作。我的问题是,我可以在我的应用程序的新版本上使用这个包:

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @aspnet/signalr-client@1.0.0-alpha2-update1 install: `echo "This package has been deprecated. Use '@aspnet/signalr' instead." && exit 1`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @aspnet/signalr-client@1.0.0-alpha2-update1 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

然后我尝试使用推荐的版本,我遵循这篇文章,Angular 6应用程序端的一切都运行正常,但它从未真正连接到Hub。这是我在运行本地Angular应用程序时收到的消息:

Access to XMLHttpRequest at 'http://localhost:27081/hub/notification/negotiate?jwttoken=the_token_here' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

这不是一个真正的CORS问题,我让WebAPI和Angular应用程序在同一个域中运行,我的旧应用程序中从未出现过CORS问题。我有正确的Cors策略来允许localhost使用api。

奇怪的是,客户端将negotiate添加到连接URL中,即使我在这个地址中进行集线器应答,我也会收到错误400,并显示以下消息:Connection ID required

我相信这个客户端库是用另一个版本制作的,而不是我在服务器上的版本,因为客户端和服务器必须遵循相同的版本。

我尝试使用旧的Angular应用程序中的node_modules,但无法编译。。我不知道该怎么办。有人经历过这个问题并设法解决了吗?有什么建议吗?我无法在WebAPI上更新版本,否则我将使当前应用程序停止工作。

感谢的帮助

我只是在不更改webapi版本的情况下让它工作。这就是我连接的方式:

this._hubConnection = new signalR.HubConnectionBuilder()
.withUrl('http://localhost:27081/hub/notification/?jwttoken='+ this.jwt, 
{
accessTokenFactory: ()=> this.jwt ,
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();

仅此而已。是的,在API中的版本中,我必须在查询中发送令牌。这份文件帮助我做到了这一点。

如果你可以,你应该更新到最新的.Net核心SignalR

这包括客户端脚本@aspnet/signalR(目前为1.0.4(

使用最新的Nuget包Microsoft.AspNetCore.SignalRCore(当前为1.0.4(

还要注意的是,在预览版本更改的javascript中初始化集线器,看起来像这样:

var connection = new signalR.HubConnectionBuilder().withUrl("/yourhub/").build();

最新更新