API da Web do ASP.NET de auto-hospedagem e o aplicativo de serviço do Windows Self-host SignalR juntos

10

Eu queria criar um serviço do Windows que oferecesse alguns serviços por meio da API da Web do ASP.NET de auto-hospedagem. Além disso, gostaria de informar os clientes sobre algumas alterações por meio do sinalizador de auto-host. Eu pensei que o ASP.NET SignalR seria a solução perfeita para o hub de notificação.

Quando eu executo o serviço, eles não funcionam juntos. Se eu excluir o SignalR, a API do Self-host começará a funcionar perfeitamente. O inverso também: exclua o serviço do Windows e o SignalR funcione perfeitamente.

Não sei qual é o meu problema, é possível ter um serviço do Windows que seja auto-hospedado para o asp.net Web API e o SignalR juntos ao mesmo tempo?.

Eu tentei as duas portas iguais e diferentes, mas não funciona.

E a outra pergunta, é possível ter ambos na mesma porta?

Meus pacotes instalados:

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

Meu código

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);
        }


    }
}
    
por akaco 22.10.2015 в 08:20
fonte

1 resposta

2

Eu executo uma configuração como esta em uma das minhas APIs - ApiControllers e Signalr hub no mesmo URI. Eu acho que seu problema é com app.MapSignalR ().

Aqui está como eu faço isso na minha configuração:

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);
}
    
por Rob Keimig 05.11.2015 / 00:17
fonte