Je migre notre service SignalR vers le nouvel AspNetCore.SignalR (aperçu 2.1) et maintenant je rencontre des problèmes avec CORS. Je ne pourrai jamais accéder au service à partir de la même origine, je dois donc désactiver CORS en général.
J'ai la politique suivante de la SCRO
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
(Mes appels WebApi-Controller provenant d'une origine différente fonctionnent correctement avec cette stratégie)
Avec l'ancien package de prévisualisation de SignalR pour AspNetCore (AspNetCore.SignalR.Server), je n'ai pas eu de problèmes, mais maintenant, mon client de test a reçu un http-405 qui semble être un problème avec CORS.
Existe-t-il une configuration CORS supplémentaire pour SignalR ou dois-je autoriser autre chose?
Edit : J'ai créé un exemple de projet vierge/vierge sans aucun middleware spécial, afin de vérifier si l'erreur se produit ici et si elle se produit.
Exemple d'application Web | startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using WebApplication1.HUBs;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
services.AddMvc();
services.AddSignalR(options =>
{
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("AllowCors");
app.UseMvc();
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
}
}
}
Exemple d'application Winforms
private HubConnection _hubConnection;
private void button1_Click(object sender, EventArgs e)
{
var connection = new HubConnectionBuilder().WithUrl("http://localhost:63771/test")
.WithConsoleLogger()
.WithTransport(Microsoft.AspNetCore.Sockets.TransportType.WebSockets)
.Build();
connection.StartAsync();
}
Exemple de Winforms Application ConsoleOutput
fail: Microsoft.AspNetCore.Sockets.Client.HttpConnection[8]
01/10/2018 15:25:45: Failed to start connection. Error getting negotiation response from 'http://localhost:63771/test'.
System.Net.Http.HttpRequestException: Response status code does not indicate success: 405 (Method Not Allowed).
bei System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
bei Microsoft.AspNetCore.Sockets.Client.HttpConnection.<Negotiate>d__42.MoveNext()
Essayez de déplacer app.UseSignalR()
par dessus app.UseMvc()
comme ceci
app.UseCors("AllowCors");
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
app.UseMvc();
J'ai eu le même problème, j'utilise reactjs pour clientside . Changer la version utilisant "@aspnet/signalr-client"
en "@aspnet/signalr"
a résolu mon problème.
Vous devez mettre à jour votre paquet vers @aspnet/signalr
lors de la mise à jour vers preview1:
REMARQUE: aperçus précédents de la bibliothèque cliente SignalR pour JavaScript ont été nommés @ aspnet/signalr-client. Cela a été déconseillé à partir de Aperçu 1.
J'ai résolu le problème.
Le package client et le package serveur n'étaient pas dans l'état exact de Subversion . Il s'agissait de 2.1-preview3210 et 2.1-preview3209 (numéros d'exemple).
Le paquet de serveur est publié dans le flux de nuget fréquemment, mais pas le paquet de client (npm). Alors j'ai cloné le dernier repo git par moi-même et construit les libs et ça marche.
Vous n'aurez plus le problème, le paquet client est maintenant à jour.