2016-05-27 71 views
1

SignalRが非常に新しくなったので、実際には数日間しか使用していません。ネゴシエートしようとしたときにSignalR 404エラーが発生する

SignalR negotiate error

問題のアプリケーションのためのコードは二つのプロジェクト、ウェブAPIおよび単一ページのアプリケーション(SPA)に位置しています:私のアプリケーションは、最初の起動時にとにかく、私は下のエラーを取得しています。最初のものにはバックエンドコード(C#)があり、もう1つはクライアントサイドコード(AngularJS)です。この問題は、問題のプロジェクトが別のポートで実行されていることが原因と考えられます。私のSignalRハブ生活のWeb APIは、ポート60161上にあり、SPAは60813.上にある私のハブはそのように宣言されています

public class ReportHub : Hub 
{ 
    public void SendReportProgress(IList<ReportProgress> reportProgress) 
    {     
     this.Clients.All.broadcastReportProgress(reportProgress); 
    } 

    public override Task OnConnected() 
    { 
     this.Clients.All.newConnection(); 

     return base.OnConnected(); 
    } 
} 

、その後、私のWeb APIのための私のStartup.csファイルに私はSignalRを初期化しますこのように:私のクライアント側のコードの場合

public void Configuration(IAppBuilder app) 
{   
    HttpConfiguration config = new HttpConfiguration(); 
    config.Services.Replace(typeof(IHttpControllerActivator), new NinjectFactory()); 
    config.MessageHandlers.Add(new MessageHandler()); 

    //set up OAuth and Cors 
    this.ConfigureOAuth(app); 
    config.EnableCors(); 
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

    // Setting up SignalR 
    app.Map("/signalr", map => 
    { 
     map.UseCors(CorsOptions.AllowAll); 
     map.RunSignalR(new HubConfiguration { EnableJSONP = true }); 
    }); 

    //set up json formatters 
    FormatterConfig.RegisterFormatters(config.Formatters); 

    WebApiConfig.Register(config); 

    app.UseWebApi(config); 
} 

私は角signalRのAPIを使用します(Angular-signalr-hub)アンギュラsignalrハブと呼ばれます。クライアント側は、次のとおりです。

angular 
.module("mainApp") 
.factory("reportHubService", ["$rootScope", "Hub", reportHubService]); 

/// The factory function 
function reportHubService($rootScope, Hub) { 
    var vm = this; 
    vm.reportName = "None"; 

    // Setting up the SignalR hub 
    var hub = new Hub("reportHub", { 
     listeners: { 
      'newConnection': function(id) { 
       vm.reportName = "SignalR connected!"; 
       $rootScope.$apply(); 
      }, 
      'broadcastReportProgress': function (reportProgress) { 
       vm.reportName = reportProgress.reportName; 
       $rootScope.$apply(); 
      } 
     }, 
     errorHandler: function(error) { 

     }, 
     hubDisconnected: function() { 
      if (hub.connection.lastError) { 
       hub.connection.start(); 
      } 
     }, 
     transport: 'webSockets', 
     logging: true 
     //rootPath: 'http://localhost:60161/signalr' 
    }); 

Iやったいくつかの昨日、私が来た時に候補の1つ(上記のコメントアウト行)私は私のウェブAPIの1つにSignalR URLを設定したグーグル。

SignalR dynamic proxy file

と私は自分のアプリケーションを実行します。私は今、私のブラウザでhttp://localhost:60161/signalr/hubsに行けば、それは私に、動的に生成されたプロキシファイルを示していたので、私は何かをするように見えるん問題の行を、コメントを解除する場合私はもはや上記のエラーを取得しませんが、今は接続していないようです。それは交渉の行に取得し、それはそこに停止します。

SignaR log

私はそれがこの(これは私が見つけたSignalRのチュートリアルからである)ようになっているはずだと思う。また

SignalR log 2

、上記のAngularコードで宣言されているリスナーは誰も呼ばれません。ログには、接続が正常に確立されたなどの理由で、より多くの行が存在するはずです。ここで何が問題になる可能性がありますか?

UPDATE:さらに、デバッグ時に、私は、問題を見つけた可能性が高いはprotocolVersionプロパティは、ここでクライアントと結果の間で異なることに起因している。そのため

enter image description here enter image description here

それはそれです存在し、接続を確立できません。

+0

何が原因で問題が発生している可能性がありますか? – lukegf

答えて

1

私は問題が何かを考え出しました。私のSignalRの依存関係は古くなっていたため、クライアントとサーバーのバージョンが異なりました。私がしなければならなかったのは、(NuGet Package Manager経由で)最新のバージョンへのすべてのSignalRの依存関係を更新していただけです。

SignalRは、何が間違っているかを私に伝えることはあまりよくありませんでした。実際には、私が既に持っていた(ログオンした)ロギングに加えて、発見されたか、オンになっていなければならない追加のロギングがあった場合を除いて、エラーメッセージは表示されませんでした。どちらの方法でも、特定のエラーを記録していないか、すべてのログを有効にする方法がわかりにくいです。問題が何かを理解するためにJQuery SignalR APIをデバッグしなければならず、これは時間のかかる作業でした。

関連する問題