Ich habe eine .Net Core 2.0 C # Web-API, die einen SignalR Core-Hub ausführt. Ich kann meine hubConnection nicht einmal starten () von angle (5.0.1), wobei diese Fehlermeldung angezeigt wird:
OPTIONS https: // localhost: 44301/hubs/sample 405 (Methode nicht zulässig)
Fehler: Die Verbindung konnte nicht hergestellt werden. Fehler: Methode nicht zulässig
Fehler beim Verbindungsaufbau :(
XHR konnte nicht geladen werden: OPTIONS " https: // localhost: 44301/hubs/sample ".
HttpError: Methode nicht zulässig at XMLHttpRequest.xhr.onload [as __zone_symbol__ON_PROPERTYload] (webpack-intern: ///../../../../../@aspnet/signalr-client/dist/src/HttpClient.js: 30: 28) at XMLHttpRequest.wrapFn (webpack-intern: ///../../../../../zone.js/dist/zone.js: 1166: 39) at ZoneDelegate.invokeTask (webpack-intern: ///../../../../../zone.js/dist/zone.js: 425: 31) at Object.onInvokeTask (webpack-intern: ///../../../core/esm5/core.js: 4816: 33) at ZoneDelegate.invokeTask (webpack-intern: ///../../../../../zone.js/dist/zone.js: 424: 36) at Zone.runTask (webpack-intern: ///../../../../zone.js/dist/zone.js: 192: 47) at ZoneTask.invokeTask [as invoke] (webpack-intern: ///../../../../../zone.js/dist/zone.js: 499: 34) at invokeTask (webpack-intern: ///../../../../../zone.js/dist/zone.js: 1540: 14) at XMLHttpRequest.globalZoneAwareCallback (webpack-intern: ///../../../../../zone.js/dist/zone.js: 1566: 17)
Ich bemühe mich, dieses Problem sogar zu beheben, selbst mit Hilfe des Geigenspielers kann ich es nicht lösen. Es scheint kein Problem mit meiner Api zu sein, da die Kestrel-Konsole druckt, dass die Anforderung an den Hub gesendet wurde, aber keinen Fehler ausgibt. Und ich kann GET, PUT und POST ohne Probleme zu meinen Controllern bringen.
Hier ist meine StartUp.cs-Konfiguration (ich habe Code weggelassen, der für die Kürze nicht relevant ist)
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(
"CorsPolicy",
builder =>
builder
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
);
});
services.AddAuthentication();
services.AddMvcCore()
.AddAuthorization(options => {...});
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options => {...});
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors("CorsPolicy");
app.UseAuthentication();
app.UseSignalR(routes =>
{
routes.MapHub<SampleHub>("/hubs/sample");
});
app.UseMvc();
}
Hier ist mein Beispielknoten
public interface ISampleHubClient
{
Task receiveMessage(SampleRequest msg);
}
public class SampleHub : Hub<ISampleHubClient>
{
private static string _connectionId;
public async Task Subscribe(string groupName)
{
await Groups.AddAsync(Context.ConnectionId, groupName);
await Clients.Client(Context.ConnectionId).receiveMessage("Subscribed to " + groupName);
}
/// <inheritdoc />
public Task Send(SampleRequest msg)
{
ConsoleColor.Green.WriteLine("Send : " + _connectionId);
return Clients.Group(msg.Group).receiveMessage(msg);
}
}
Und hier ist mein Angular -Komponentencode:
import { HubConnection } from '@aspnet/signalr-client';
@Component({})
export class SignalRTestComponent implements OnInit {
private hubConnection: HubConnection;
ngOnInit() {
this.initHub();
}
initHub()
{
let self = this;
var signalrBaseUri = "https://localhost:44301/hubs/sample";
this.hubConnection = new HubConnection(signalrBaseUri);
this.hubConnection
.start() // <- Failure here
.then(() =>{
self.hubConnection.invoke("Subscribe", this.groupName);
})
.catch(err => { console.log("INVOKE FAILED");console.error(err);});
})
.catch(err =>
{
console.log('Error while establishing connection :(');
console.log(err);
});
this.hubConnection.on('receiveMessage', (receivedMessage: SampleMessage) => {
console.log("Message received : ");
console.log(sampleMessage);
});
}
}
Jede Hilfe wäre sehr dankbar
Das Problem ist, dass das npm-Paket umbenannt wurde von @aspnet/signalr-client
in @aspnet/signalr
. Das neue Paket zu ändern und auch die Importe zu korrigieren, funktionierte für mich (um zumindest den OPTIONS-Aufruffehler zu beseitigen.
import { HubConnection } from '@aspnet/signalr'
Pawels Kommentar brachte mich in die richtige Richtung, um dieses Problem zu lösen.
Hier sind einige Beiträge, die die Anfrage von OPTIONS und die Entscheidung, sie zu ersetzen, diskutieren.
https://github.com/aspnet/SignalR/issues/1107
https://github.com/aspnet/SignalR/issues/1111
Mein Problem scheint jedoch gelöst worden zu sein, indem ein Fehler mit einer Nuget-Paketversion korrigiert wurde.
Mir wurde klar, dass mein SignalR Hub-Projekt einen Verweis auf eine Preview-Version von Microsoft.AspNetCore.SignalR (2.1.0-preview1-27884) hatte. Ich habe es geändert, um 1.0.0-alpha2-final zu verwenden. Ich habe auch mein Verzeichnis node_modules gelöscht, meinen NPM-Cache überprüft und alles erneut neu installiert
npm cache verify
npm install
Jetzt funktioniert alles richtig.
Sie können den Verhandlungsschritt überspringen, wenn Sie nur Websockets verwenden.
this.signalRConnection = new HubConnectionBuilder()
.withUrl(your_url,
{
**skipNegotiation: true**,
**transport: HttpTransportType.WebSockets**
})
.build();
In diesem Fall kommt es nie zu Verhandlungen. Sie erhalten nur die Verbindung mit wss: //.