Laden...

SignalR Core funktioniert nicht auf Server - Lokal schon

Erstellt von schuppsl vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.421 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 4 Jahren
SignalR Core funktioniert nicht auf Server - Lokal schon

Hallo zusammen.
Ich habe mal wieder was seltsames.

Ich habe eine .NET Core 2.2 Konsolenanwendung.

Diese implementiert einen Signalr Hub.

Dieser sieht so aus:


using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.Features;
using PulverService.Models;
using PulverService;

namespace SignalR_Server
{
   

    class SignalR
    {       

        public static void StartSignalR()
        {
            string signalRHost = "http://*:2222";
            var ConsOut = Console.Out;
            Console.SetOut(new StreamWriter(Stream.Null));
            Console.SetOut(ConsOut);

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Startup>()
                .UseUrls(signalRHost)
                .Build();


            try
            {
                host.Start();
             

            }
            catch(Exception ex)
            {
                string err = ex.Message;
                ConsoleLogger.PrintToConsole("SignalR Fehler: " + ex.Message, ConsoleColor.Red);
            }

            
            ConsoleLogger.PrintToConsole("SignalR Service erstellt auf Host: "+ signalRHost, ConsoleColor.Green);
        }
    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
            {
                builder
                    .AllowAnyMethod()
                    .AllowAnyHeader().AllowCredentials().AllowAnyHeader().WithOrigins("https://localhost:44304").WithOrigins("http://localhost:18577");

            }));

            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
            app.UseCors("CorsPolicy");
            app.UseSignalR(route =>
            {
                route.MapHub<MyHub>("/stream");
            });

            ConsoleLogger.PrintToConsole("SignalR Hub erstellt auf Hub: stream", ConsoleColor.Green);
           

        }
    }

    public static class UserHandler
    {
        public static HashSet<string> ConnectedIds = new HashSet<string>();
    }

    public class MyHub : Hub
    {

        /// <summary>
        /// Hier werden die Auftragsdaten von der manuellen Aufgabe empfangen
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task SendAuftragsData( string[] data )
        {
            //Daten in SPS schreiben
             Program.sendAuftragsData(data);

        }

        public async Task SendViewDataManFront(SignalRViewDataManList dataMan)
        {
            await Clients.All.SendAsync("ReceiveViewDataFront", dataMan.ViewList);

        }

        public async Task SendViewDataManBack(SignalRViewDataManList dataMan)
        {
            await Clients.All.SendAsync("ReceiveViewDataBack", dataMan.ViewList);

        }

        public async Task SendMessage(string user, string message)
        {

            await Clients.All.SendAsync("ReceiveMessage", user, message);
            Console.WriteLine($"User: {user} says {message}");
        }

        public Task SendMessageToCaller(string message)
        {
            return Clients.Caller.SendAsync("ReceiveMessage", message);
        }

        public Task SendMessageToGroups(string message)
        {
            List<string> groups = new List<string>() { "SignalR Users" };
            return Clients.Groups(groups).SendAsync("ReceiveMessage", message);
        }

        public override async Task OnConnectedAsync()
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
            UserHandler.ConnectedIds.Add(Context.ConnectionId);
            Console.WriteLine($"Connected user: {Context.ConnectionId}");
            await base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
            UserHandler.ConnectedIds.Remove(Context.ConnectionId);
            Console.WriteLine($"Disconnected user: {Context.ConnectionId}");
            await base.OnDisconnectedAsync(exception);
        }
    }
}


Starte ich die Anwendung auf meinem Entwicklungsrechner (Windows 10), dann sieht alles super aus.
Ich kann mich mit einem JavaScript Client auf den hub verbinden.

Zum Test, ob das generell funktioniert, kann ich im Webbrowser http://localhost:2222/stream angeben.
Hier kommt dann z.B. die Meldung "Connection ID required".

Exportiere ich das Projekt lokal auf meinem Rechner, starte die Konsolenanwendung funktioniert ebenfalls alles prima.

Exportiere ich das ganze auf den Server, wo es nachher laufen soll, geht es nicht.

Die Konsonenanwendung startet, der SignalR Hub wird initialisiert und alles sieht gut aus.
Mit TCPView (Sysinternals) sehe ich, dass die Anwendung auf den Port 2222 hört.

Nur kann ich mich weder lokal noch Remote mit dem Hub verbinden.
Im Webbrowser kommt immer Fehler 400 - Bad Request.

Ich habe schon verschiedene Server, Ports und Webbrowser ausprobiert. So war ein Windows Server 2012 und ein Windows Server 2016 (Datasenter) dabei
Es scheint nur auf meinem Entwicklungsrechner zu gehen.

Auf dem 2012er laufen viele Anwendungen, unter anderem ein Dienst, der SignalR Hubs und Clients bereitstellt. Allerdings mit .NET 4.7 und eine Asp.Net Core Webanwendung.

Hat jemand eine Idee, warum das auf dem Zielrechner nicht funktionieren könnte?
Vielen Dank im Voraus!

P
441 Beiträge seit 2014
vor 4 Jahren

Gibt denn deine Serverapp irgendeine Ausgabe im Logging oder in der Console?
Hast du mal die Loglevel auf Trace gesetzt?

16.806 Beiträge seit 2008
vor 4 Jahren

Und Du hast auf dem WebServer auch für den IIS das WebSocket Protokoll installiert (via Add Roles and Features).
Würde jetzt fast wetten, dass nicht 😉

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 4 Jahren

Und Du hast auf dem WebServer auch für den IIS das WebSocket Protokoll installiert (via Add Roles and Features).
Würde jetzt fast wetten, dass nicht 😉

Doch - extra nochmals nachgesehen.

Im Windows- oder ähnlichem Log ist nichts eingetragen.
Es handelt sich um eine Konsolen App und nicht eine klassische ASP.NET Anwendung...

709 Beiträge seit 2008
vor 4 Jahren

Musst du CORS noch für den Server anders konfigurieren?

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 4 Jahren

Musst du CORS noch für den Server anders konfigurieren?

Daran habe ich auch schon gedacht, aber das ist berücksichtigt.
Das Problem ist ja, dass erst gar keine Verbindung aufgebaut wird - bei CORS ist die Meldung in der Console des Browsers eine andere - im Moment kommt HTTP400.

Eigentlich kann es nur an irgendwelche Berechtigungen liegen...

Aber dann muss ich es halt doch wieder mit OWIN machen - da laufen bereits Dienste.

P
441 Beiträge seit 2014
vor 4 Jahren

Du nutzt doch AspNetCore... AspNetCore hat ein Logging Konzept, dass auch in SignalR genutzt wird.

Hast du mal die Loglevel auf Trace gesetzt?

Wenn du das Loglevel anpasst solltest du in deiner Console (oder alternativ auf einer beliebigen LogSink) weitere Ausgaben vom Server kriegen.