2013-07-30 8 views
5

Ich versuche SignalR in Nancy in einer Konsole App zu starten.SignalR (mit selbst gehosteten Nancy) zeigt 404 für aushandeln? ClientProtocol = 1.3

Wenn mein Browser $.connection.hub.start() tut es wird 404 - NotFound für //localhost:667/negotiate?clientProtocol=1.3

---- 8 < ----

ich bin (versuchen) läuft Nancy an einem Port und SignalR auf einem anderen. Nancy arbeitet mit Razor. SignalR gibt das Hub-JavaScript in Ordnung zurück.

(Sorry für die Menge an Code unten, aber ich habe nicht in der Lage gewesen, es weiter zu reduzieren.)
(Diese Frage könnte von einer früher erkannt werden. - jetzt gelöscht Frage, die ich schlecht markiert worden)

Client-Code:

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

Code Server (in der Programmkonsole als Administrator ausgeführt wird)

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

Antwort

7

ich habe versucht, die über Code mit Signaler 1.1.2 und mit SignalR 2.0.0-beta2. Die einzige Änderung, die ich an Ihrem Code tat, ist

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

zu

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

und hinzugefügt js Funktion AddMessage modifizieren, um die empfangene Nachricht anzuzeigen und sie ausgeführt Anzeigen erfolgreich die Meldung ‚funktioniert! "

4

Zuerst möchte ich Ihnen für Ihren Code oben danken. Es hat mir sehr geholfen!

Ausgehend von Ihrem Code habe ich eine Lösung, wo Nancy & SignalR läuft auf dem gleichen Port in Owin erstellt.

Die Konsole Anwendungscode ist dies

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"]; 
      }; 
     } 
    } 
} 

und die Aussicht ist dieses

<!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

Vielen Dank für dieses Posting Code zurück zur Frage. Sehr klar und Beispiel. Ich hatte einen SignalR-Server und wollte einen Nancy POST-Handler hinzufügen, dies funktionierte zum ersten Mal. Zu Ihrer Information, ich musste Nancy.Owin Paket nur für jeden hinzufügen, der das gleiche tut. –