2015-10-22 22 views
9

セルフホストASP.NET Web API経由でいくつかのサービスを提供するWindowsサービスを構築したいと考えました。また、Self-host SignalRを介してクライアントにいくつかの変更点を伝えたいと思っていました。私はASP.NET SignalRが通知ハブのための完璧なソリューションであると思った。セルフホストASP.NET Web APIとセルフホストSignalR Windowsサービスアプリケーション

私は両方のサービスを実行するときに一緒に動作しません。 SignalRを削除すると、自己ホストAPIが完全に動作し始めます。 Windowsサービスを削除すると、SignalRは完全に機能します。

私の問題は、asp.net Web APIとSignalRを同時にホストしているWindowsサービスを持つことは可能でしょうか。

私は同じポートと異なるポートで両方を試しましたが、動作しません。

もう1つの質問は、同じポートに両方を持つことは可能ですか?

マイインストールされているパッケージ: - 同じURIにApiControllersとSignalrハブ

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

私のコード

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 –

答えて

2

は、私はちょうど私のAPIのいずれかでこのようなコンフィギュレーションを実行します。あなたの問題はapp.MapSignalR()の問題だと思います。ここで

は、私は私の設定でそれを行う方法です。

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

これは私のシステムを働かせるのに役立ちました。言いたいことがあります:appBuilder.UseWebApiをappBuilder.Map呼び出しの後に置いてください。それはまっすぐ私のために働くことを見ていませんでした。 – Gerfboy

関連する問題