SignalR (dengan Nancy yang dihosting sendiri) menunjukkan 404 untuk negosiasi?clientProtocol=1.3

Saya mencoba menjalankan SignalR di Nancy di aplikasi konsol.

Ketika browser saya melakukan $.connection.hub.start() maka mendapat 404 - NotFound untuk //localhost:667/negotiate?clientProtocol=1.3

----8<----

Saya (mencoba) menjalankan Nancy di satu port dan SignalR di port lain. Nancy bekerja dengan Razor. SignalR mengembalikan javascript hub dengan baik.

(Maaf atas banyaknya kode di bawah ini tetapi saya belum dapat menguranginya lebih jauh.)
(Pertanyaan ini mungkin dikenali dari pertanyaan sebelumnya - sekarang telah dihapus dan telah saya beri label buruk.)

Kode klien:

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

Kode server (dalam program konsol berjalan sebagai 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);
    }
}

person LosManos    schedule 30.07.2013    source sumber


Jawaban (2)


Saya mencoba kode di atas dengan Signalr 1.1.2 dan SignalR 2.0.0-beta2. Satu-satunya perubahan yang saya lakukan pada kode Anda adalah

memodifikasi

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

to

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

dan menambahkan fungsi js AddMessage untuk menampilkan pesan yang diterima dan dieksekusi dengan sukses menampilkan pesan 'Berhasil!'

person Jabez    schedule 02.08.2013

Pertama-tama saya ingin mengucapkan terima kasih atas kode Anda di atas. Itu banyak membantu saya!

Mulai dari kode Anda, saya telah membuat solusi di mana Nancy & SignalR berjalan pada port yang sama di dalam Owin.

Kode aplikasi konsolnya adalah ini

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

dan pemandangannya begini

<!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
Terima kasih telah memposting kode ini kembali ke pertanyaan. Sangat jelas dan memberi contoh. Saya memiliki server SignalR dan ingin menambahkan pengendali Nancy POST ke dalamnya, ini berhasil untuk pertama kalinya. FYI, saya harus menambahkan paket Nancy.Owin hanya untuk siapa saja yang melakukan hal yang sama. - person David Ritchie; 27.04.2015