2013-07-30 8 views
5

Próbuję uruchomić SignalR w Nancy w app konsoli.SignalR (z własnym gospodarzem Nancy) pokazuje 404 do negocjacji? ClientProtocol = 1,3

Kiedy moja przeglądarka nie $.connection.hub.start() robi 404 - NotFound dla //localhost:667/negotiate?clientProtocol=1.3

---- 8 < ----

ja (stara) prowadzenie Nancy na jednym porcie i SignalR na innym. Nancy współpracuje z Razor. SignalR zwraca koncentrator javascript w porządku.

(Przepraszam za ilość kodu poniżej, ale nie byłem w stanie zmniejszyć go dalej.)
(To pytanie może być uznane ze starszej. - teraz usunięty pytanie, które ja oznaczonego źle)

Kod

Klient:

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

kod Server (w programie konsoli działa jako admin)

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

Odpowiedz

7

próbowałem powyższy kod z Signalr 1.1.2 i SignalR 2.0.0-beta2. Jedyną zmianą zrobiłem kodzie jest

modyfikować

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

do

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

i dodał js funkcji AddMessage aby wyświetlić odebraną wiadomość i wykonana pomyślnie wyświetlając komunikat „działa! "

4

Przede wszystkim chcę podziękować za kodzie powyżej. Bardzo mi to pomogło!

Począwszy od kodu stworzyłem rozwiązanie, w którym Nancy & SignalR działa na tym samym porcie wewnątrz Owin.

Kod aplikacji konsoli jest to

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

i widok jest to

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

Dzięki za komentarz ten kod wracając do pytania. Bardzo wyraźny i przykładowy. Miałem serwer SignalR i chciałem dodać do niego obsługę Nancy POST, działało to po raz pierwszy. FYI, musiałem dodać pakiet Nancy.Owin tylko dla każdego, kto robi to samo. –

Powiązane problemy