2013-07-30 9 views
5

Sto cercando di eseguire SignalR in Nancy in un'app console.SignalR (con auto-ospitato Nancy) mostra 404 per negoziare? ClientProtocol = 1.3

Quando il mio browser fa $.connection.hub.start() si ottiene 404 - NotFound per //localhost:667/negotiate?clientProtocol=1.3

---- ---- 8 <

sto (cercando) in esecuzione Nancy su una porta e SignalR su un altro. Nancy lavora con Razor. SignalR restituisce l'hub javascript a posto.

(Ci scusiamo per la quantità di codice di seguito, ma non sono stato in grado di ridurre ulteriormente.)
(questa domanda potrebbe essere riconosciuto da un precedente -. Questione ora eliminato che avevo etichettato male)

codice

Cliente:

<script type="text/javascript" src='/Scripts/jquery-1.6.4.min.js'></script> 
    <script type="text/javascript" src="/Scripts/jquery.signalR-2.0.0-beta2.js"></script> 
    <script src="http://localhost:667/signalr/hubs" type="text/javascript"></script> 
var chat; 
$(function() { 
    $.connection.hub.url = '//localhost:667'; 
    $.connection.hub.logging = true; 
    chat = $.connection.chat; 
    chat.client.addMessage = onAddMessage; // declared but not here 

    $.connection.hub.start() 
     .done(function() { 
      alert($.connection.id); 
      chat.server.send('Works!'); 
     }) 
     .fail(function (failreason) { 
      alert(failreason); 
     }); 
}); 

codice del server (in programma di console in esecuzione come amministratore)

class Program 
{ 
    static void Main(string[] args) 
    { 
     const string webUrl = "http://localhost:666"; 
     const string signalrUrl = "http://localhost:667"; 

     using (var webHost = new Nancy.Hosting.Self.NancyHost(
      new Uri(webUrl))) 
     { 
      using (WebApp.Start<Startup>(signalrUrl)) 
      { 
       webHost.Start(); 

       Console.Write("Press any key"); 
       Console.ReadKey(); 
       webHost.Stop(); 
      } 
     } 
    } 
} 

class Startup 
{ 
    public void Configuration(Owin.IAppBuilder app) 
    { 
     app.MapHubs(new HubConfiguration() { EnableCrossDomain = true }); 
     app.UseNancy(new ApplicationBootstrapper()); 
    } 
} 

public class ApplicationBootstrapper : DefaultNancyBootstrapper 
{ 
    protected override void ConfigureConventions(
     Nancy.Conventions.NancyConventions nancyConventions) 
    { 
     nancyConventions.StaticContentsConventions.Add(
     Nancy.Conventions.StaticContentConventionBuilder.AddDirectory(
      "Scripts", @"/Scripts") 
     ); 
     base.ConfigureConventions(nancyConventions); 
    } 
} 

public class Chat : Hub 
{ 
    public void Send(string message) 
    { 
     Clients.All.addMessage(message); 
    } 
} 

risposta

7

ho provato la codice sopra con Signalr 1.1.2 e con SignalR 2.0.0-beta2. L'unico cambiamento che ho fatto per il codice è

modificare

$.connection.hub.url = '//localhost:667'; 

a

$.connection.hub.url = 'http://localhost:667/signalr'; 

e ha aggiunto js funzione addMessage per visualizzare il messaggio ricevuto ed eseguito la visualizzazione con successo il messaggio 'funziona! '

4

Prima di tutto voglio ringraziarvi per il vostro codice qui sopra. Mi ha aiutato molto!

A partire dal codice ho creato una soluzione in cui Nancy & SignalR viene eseguito sulla stessa porta all'interno di Owin.

Il codice dell'applicazione console è questo

using System; 
using Microsoft.AspNet.SignalR; 
using Microsoft.Owin.Hosting; 
using Nancy; 
using Owin; 

namespace NancySignalrOwin 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var url = "http://localhost:8080"; 

      using (WebApp.Start<Startup>(url)) 
      { 
       Console.WriteLine("Running on http://localhost:8080", url); 
       Console.WriteLine("Press enter to exit"); 
       Console.ReadLine(); 
      } 
     } 
    } 

    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.MapSignalR(); 
      app.UseNancy(); 
     } 
    } 

    public class MyHub : Hub 
    { 
     public void Send(string name, string message) 
     { 
      Console.WriteLine("{0} said {1}", name, message); 
      Clients.All.addMessage(name, message); 
     } 
    } 

    public class HomeModule : NancyModule 
    { 
     public HomeModule() 
     { 
      Get["/"] = x => 
      { 
       return View["index"]; 
      }; 
     } 
    } 
} 

e la vista è questo

<!DOCTYPE html> 
<html> 
<head> 
    <title>SignalR Simple Chat</title> 
    <style type="text/css"> 
     .container { 
      background-color: #99CCFF; 
      border: thick solid #808080; 
      padding: 20px; 
      margin: 20px; 
     } 
    </style> 
</head> 
<body> 
    <div class="container"> 
     <input type="text" id="message" /> 
     <input type="button" id="sendmessage" value="Send" /> 
     <input type="hidden" id="displayname" /> 
     <ul id="discussion"></ul> 
    </div> 
    <!--Script references. --> 
    <!--Reference the jQuery library. --> 
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.js"></script> 
    <!--Reference the SignalR library. --> 
    <script src="/Content/jquery.signalR-2.0.0-rc1.min.js"></script> 
    <!--Reference the autogenerated SignalR hub script. --> 
    <script src="/signalr/hubs"></script> 
    <!--Add script to update the page and send messages.--> 
    <script type="text/javascript"> 
     $(function() { 
      // Declare a proxy to reference the hub. 
      var chat = $.connection.myHub; 

      // Create a function that the hub can call to broadcast messages. 
      chat.client.addMessage = function (name, message) { 
       // Html encode display name and message. 
       var encodedName = $('<div />').text(name).html(); 
       var encodedMsg = $('<div />').text(message).html(); 
       // Add the message to the page. 
       $('#discussion').append('<li><strong>' + encodedName 
        + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>'); 
      }; 
      // Get the user name and store it to prepend to messages. 
      $('#displayname').val(prompt('Enter your name:', '')); 
      // Set initial focus to message input box. 
      $('#message').focus(); 
      // Start the connection. 
      $.connection.hub.start().done(function() { 
       $('#sendmessage').click(function() { 
        // Call the Send method on the hub. 
        chat.server.send($('#displayname').val(), $('#message').val()); 
        // Clear text box and reset focus for next comment. 
        $('#message').val('').focus(); 
       }); 
      }); 
     }); 
    </script> 
</body> 
</html> 
+0

Grazie per la pubblicazione di questo codice di nuovo alla domanda. Molto chiaro ed esempio. Avevo un server SignalR e volevo aggiungere un gestore di Nancy POST ad esso, questo ha funzionato per la prima volta. Cordiali saluti, ho dovuto aggiungere il pacchetto Nancy.Owin solo per chiunque facesse lo stesso. –