我正在尝试使用nuget软件包Microsoft.AspNetCore.SignalR.1.1.0
从Javascript客户端到ASP.NET核心应用使用SignalR
第一
services.AddSignalR(c => c.EnableDetailedErrors = true);
然后,我按如下所示配置了CORS。我们使用HttpSys
。我怀疑这里是问题async
,因为这可能意味着CORS没有在UseSignalR
之前设置,所以我尝试使用命名策略并且有效。
app.Use (async (context, next) => {
var url = GetOriginUrl (context.Request);
context.Response.Headers.Add ("Access-Control-Allow-Origin", url);
context.Response.Headers.Add ("Access-Control-Allow-Credentials", "true");
if (context.Request.Method == "OPTIONS") {
context.Response.Headers.Add ("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
context.Response.Headers.Add ("Access-Control-Allow-Headers", "Content-Type, Accept, User, x-requested-with");
}
#if RUN_ON_WINDOWS`
if (context.Request.Method != "OPTIONS" && !context.Request.HttpContext.User.Identity.IsAuthenticated) {
context.Response.StatusCode = 401;
return; //Stop pipeline and return immediately.
}
#endif`
await next ();
});
...之后...
app.UseStaticFiles ()
.UseSignalR (routes => {
routes.MapHub<LiveMarginSource> ("/api/liveMarginHub");
})
.UseStatusCodePages ()
.UseMvc ()
.UseSwagger ()
.UseSwaggerUI (c => { c.SwaggerEndpoint ("/swagger/v1/swagger.json", "Collateral Management API"); });
然后在客户端中... @aspnet/signalr@^1.1.4
connectLiveMargin = () => {
const liveMarginHub = new SignalR.HubConnectionBuilder()
.withUrl('http://localhost:5000/api/liveMarginHub')
.configureLogging(SignalR.LogLevel.Debug)
.build();
liveMarginHub.on('ReceiveMessage', data => {
console.log(data);
// find the data row and update
});
liveMarginHub.start()
.catch(err => console.log(err));
}
但是我无法建立连接
SignalR
本身似乎在以这种方式启动Chrome浏览器时工作"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:/Chrome dev session" --disable-web-security
解决方案(至少在客户端和服务器都在我的本地计算机中时有效) 然后,我尝试了一些已发布的尝试以下方式,尽管我不喜欢以这种方式或作为应用程序设置来指定来源。要测试在部署到服务器或在Linux的Kubernetes容器中运行时的行为
services.AddCors(options => {
options.AddPolicy("SignalRPolicy",
builder => {
builder.WithOrigins(new string[] { "http://localhost:3000" })
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
之后...
app.UseCors("SignalRPolicy")
.UseStaticFiles()
.UseStatusCodePages()
.UseMvc()
.UseSignalR(routes => {
routes.MapHub<LiveMarginSource>("/api/liveMarginHub");
})
.UseSwagger()
.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Collateral Management API"); });
答案 0 :(得分:0)
在这种情况下,buildUrl怎么办?
以为您的代码应该是这样,而问题可能来自buildUrl
const connection = new signalR.HubConnectionBuilder()
.withUrl("/liveMarginHub")
.configureLogging(signalR.LogLevel.Information)
.build();