web-dev-qa-db-de.com

Es kann keine Verbindung zum Signalr Core Hub mit hergestellt werden Angular 5 Client

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

4
pieperu

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'

5
Thomas

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. 

0
pieperu

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: //.

0
Roman Olkhovsky