2015-08-16 16 views
5

Ho assistente SignalR come progetto Libreria di classi e ho fatto riferimento in applicazione console (per simulare servizio Windows)self-hosted service SignalR non funziona (inizio)

Ecco il codice per SignalR

public void Start() 
    { 
     try 
     { 
      string url = @"http://*:8081"; 
      using (WebApp.Start<Startup>(url)) 
      { 
       Logger.Info(string.Format("Server running at {0}", url)); 
      } 
     } 
     catch (Exception ex) 
     { 
      Logger.Exception(ex, "Signalr start"); 
     } 

     Run = true; 

     Logger.Info("Starting Worker"); 
     workerThread = new Thread(() => 
     { 
      Worker(); 
     }); 

     workerThread.Start(); 
    } 

e qui è classe di avvio

public class Startup 
    { 
     Microsoft.AspNet.SignalR.HubConfiguration hubconfiguration = null; 

     public void Configuration(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 
      hubconfiguration = new HubConfiguration(); 
      hubconfiguration.EnableDetailedErrors = true; 
      app.MapSignalR(hubconfiguration); 
     } 
    } 

così, è in un thread, e l'operaio è in un altro. Ciò sembra soddisfacente dato che l'ho fatto in un altro progetto in cui funziona. Il thread di lavoro non è un problema, è solo un ciclo vuoto, non correlato al server in alcun modo.

Il problema è che il server sembra "fermarsi" - quando guardo con Netstat, nessuno sta ascoltando sulla porta 8081. Non c'è eccezione, fallisce silenziosamente.

Ho fatto riferimento a Owin.Cors (e Owin.Host.HttpListener) nel progetto della console che esegue effettivamente questo server ma, come ho detto, il server si ferma.

Quando provo a connettermi, il client dice "connessione attivamente rifiutata" e Putty (telnet) dice anche "non può connettersi".

Dov'è il problema? In poche parole, ho una libreria di classi con server SignalR a cui si fa riferimento nel progetto della console che lo esegue ma il server non funzionerà.

[modifica]

E c'è il codice di Console app che avvia il servizio

static void Main(string[] args) 
    { 
     ServiceEngine Engine = new ServiceEngine(); 
     Engine.Start(); 
     Console.ReadKey(); 
     Engine.Stop(); 
    } 

P.S. Scusa per il mio cattivo inglese.

risposta

1

Bene, l'ho risolto. Ecco un problema:

public static void Start() 
    { 
     try 
     { 
      string url = @"http://127.0.0.1:8081"; 
      WebApp.Start<Startup>(url); 
      Logger.Info(string.Format("Server running at {0}", url)); 
     } 
     catch (Exception ex) 
     { 
      Logger.Exception(ex, "signalr start"); 
     } 

     Run = true; 

     Logger.Info("Starting Worker"); 
     workerThread = new Thread(() => 
     { 
      Worker(); 
     }); 

     workerThread.Start(); 
    } 

Come si può vedere, l'istruzione è stata rimossa e ora funziona correttamente! Nota interessante: puoi anche realizzare l'implementazione Singleton di questo "Motore", e funzionerà anche.

+0

Si dovrebbe contrassegnare questo come risposta! Buona fortuna! –

+0

@Matei_Radu, lo farò, quando il sito lo permetterà ... Dice tra due giorni. – nighthawk

0

Ho ottenuto la soluzione dopo aver eseguito molto R & D. E si tratta di una semplice modifica correlata all'account e ai diritti di accesso.

Utilizzare l'account LocalSystem anziché l'account LocalService nel programma di installazione del servizio.

È possibile eseguire questa operazione da fare sotto cambiamento nella vista di disegno del vostro installatore di servizio:
proprietà del Servizio di installazione Processo -> Imposta Account a LocalSystem.

o facendo sotto cambiamento in designer.cs file del servizio di installazione:
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;

Problemi correlati