2015-10-22 19 views
9

Volevo creare un servizio Windows che fornisca alcuni servizi tramite API Web ASP.NET self-host. Inoltre, volevo informare i clienti su alcune modifiche tramite Self-host SignalR. Pensavo che ASP.NET SignalR sarebbe la soluzione perfetta per l'hub di notifica.API Web ASP.NET self-host e SignalR self-host insieme all'applicazione servizio Windows

Quando eseguo entrambi i servizi, non funzionano insieme. Se cancello SignalR, l'API Self-host inizia a funzionare perfettamente. Viceversa: elimina il servizio Windows e SignalR funziona perfettamente.

Non sono sicuro di quale sia il mio problema, è possibile avere un servizio Windows che è auto-ospitato contemporaneamente per asp.net Web API e SignalR ?.

Ho provato entrambi su porte identiche e diverse ma non funziona.

E l'altra domanda, è possibile avere entrambi sullo stesso porto?

miei pacchetti installati:

Microsoft.AspNet.WebApi.SelfHost 
Microsoft.AspNet.SignalR.SelfHost 
Microsoft.AspNet.WebApi.Owin 
Microsoft.Owin.Host.HttpListener 
Microsoft.Owin.Hosting 
Microsoft.Owin.Cors 

mio codice

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web.Http; 
using System.Web.Http.SelfHost; 

using Microsoft.AspNet.SignalR; 
using Microsoft.Owin.Hosting; 
using Owin; 
using Microsoft.Owin.Cors; 
using Microsoft.Owin; 

[assembly: OwinStartup(typeof(WindowsService_HostAPI.Startup))] 
namespace WindowsService_HostAPI 
{ 
    partial class SelfHostService : ServiceBase 
    { 
     IDisposable SignalR; 

     EventLog myLog = new EventLog(); 
     private const string appId = "MYHUB"; 
     public SelfHostService() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      myLog.Source = "MY HUB "; 
      var config = new HttpSelfHostConfiguration("http://localhost:9090"); 

      config.Routes.MapHttpRoute(
       name: "API", 
       routeTemplate: "{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      HttpSelfHostServer server = new HttpSelfHostServer(config); 



      string CertLocation = ""; 
      server.OpenAsync().Wait(); 
      try 
      { 


       myLog.WriteEntry("Notification HUB Start "); 
      } 
      catch (Exception ex) 
      { 
       myLog.WriteEntry("Notification Failed TO Start : " + ex.Message + " |||| " + CertLocation); 
      } 
      // SignalR 
      string url = "http://localhost:9191"; 
      SignalR = WebApp.Start(url); 

     } 

     protected override void OnStop() 
     { 
      // TODO: Add code here to perform any tear-down necessary to stop your service. 
      try 
      { 
       push.StopAllServices(true); 
       SignalR.Dispose(); 
      } 
      catch (Exception ex) 
      { 
       myLog.WriteEntry("Notification Failed TO Stop : " + ex.Message); 
      } 

     } 
    } 
    class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 
      app.MapSignalR(); 
     } 
    } 
    public class UserGroupNotification : Hub 
    { 
     public void Send(string UGID, string message) 
     { 

      Clients.All.addMessage(UGID, message); 
     } 


    } 
} 
+1

http://www.codeproject.com/Articles/869223/ASP-NET-Web-Api-Create-a-Self-Hosted- OWIN-Based-We –

risposta

2

corro una configurazione proprio come questo su uno dei miei API - ApiControllers e hub Signalr sulla stessa URI. Penso che il tuo problema riguardi il pezzo app.MapSignalR().

Ecco come lo faccio nel mio config:

public void Configuration(IAppBuilder appBuilder) 
{ 
    var config = new HttpConfiguration(); 

    //I use attribute-based routing for ApiControllers 
    config.MapHttpAttributeRoutes(); 

    appBuilder.Map("/signalr", map => 
    { 
     var hubConfiguration = new HubConfiguration 
     { 

     }; 

     map.RunSignalR(hubConfiguration); 
    }); 

    config.EnsureInitialized(); //Nice to check for issues before first request 

    appBuilder.UseWebApi(config); 
} 
+0

Questo mi ha aiutato a far funzionare il mio sistema. Una cosa da ricordare potrebbe essere utile: assicurati di mettere la chiamata appBuilder.UseWebApi DOPO la chiamata appBuilder.Map. Non ha funzionato bene per me al contrario. – Gerfboy

Problemi correlati