SignalR (с собственным хостингом Нэнси) показывает 404 для переговоров? clientProtocol=1.3

Я пытаюсь запустить SignalR в Нэнси в консольном приложении.

Когда мой браузер выполняет $.connection.hub.start(), он получает 404 - NotFound за //localhost:667/negotiate?clientProtocol=1.3

----8<----

Я (пытаюсь) запустить Nancy на одном порту и SignalR на другом. Нэнси работает с Razor. SignalR возвращает JavaScript-концентратор в порядке.

(Извините за объем кода ниже, но я не смог его еще больше сократить.)
(Этот вопрос может быть распознан из более раннего - теперь удаленного вопроса, который я плохо пометил.)

Код клиента:

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

Код сервера (в консольной программе, работающей от имени администратора)

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

person LosManos    schedule 30.07.2013    source источник


Ответы (2)


Я попробовал приведенный выше код с Signalr 1.1.2 и с SignalR 2.0.0-beta2. Единственное изменение, которое я сделал в вашем коде, это

изменить

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

to

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

и добавлена ​​​​функция js AddMessage для отображения полученного сообщения, и она успешно выполнена, отображая сообщение «Работает!»

person Jabez    schedule 02.08.2013

Прежде всего, я хочу поблагодарить вас за ваш код выше. Это мне очень помогло!

На основе вашего кода я создал решение, в котором Nancy и SignalR работают на одном порту внутри Owin.

Код консольного приложения такой

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

а вид такой

<!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>
person jitidea    schedule 17.10.2013
comment
Спасибо, что отправили этот код обратно в вопрос. Очень понятно и на примере. У меня был сервер SignalR, и я хотел добавить к нему обработчик Nancy POST, это сработало в первый раз. К вашему сведению, мне пришлось добавить пакет Nancy.Owin только для тех, кто делает то же самое. - person David Ritchie; 27.04.2015