【问题标题】:SignalR echo/negotiate not found?未找到 SignalR 回显/协商?
【发布时间】:2013-11-03 01:27:15
【问题描述】:

Index.cshtml

@{
    ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery.signalR-2.0.0.min.js"></script>
<script>
$(function () {
    var connection = $.connection('/echo');

    connection.received(function (data) {
        $('#messages').append('<li>' + data + '</li>');
    });

    connection.start().done(function () {
        $("#broadcast").click(function () {
            connection.send($('#msg').val());
        });
    });

});
</script>
<input type="text" id="msg" />
<input type="button" id="broadcast" value="broadcast" />

<ul id="messages">
</ul>

startup.cs

using Microsoft.Owin;
using Owin;
using UI;

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

MyConnection.cs

public class MyConnection : PersistentConnection
{
    protected override Task OnConnected(IRequest request, string connectionId)
    {
        return Connection.Send(connectionId, "Welcome!");
    }

    protected override Task OnReceived(IRequest request, string connectionId, string data)
    {
        return Connection.Broadcast(data);
    }
}

我是 signalR 的新手。当我启动项目时,出现以下错误:

http://localhost:49820/echo/negotiate?clientProtocol=1.3&_=1383403303981404(未找到)

这是什么原因,我该如何解决?我找不到有关此问题的任何解决方案。 (.net 框架 4.5 和 signalR 2.0)

【问题讨论】:

  • 我猜你忘了在视图中添加
  • @Lin,我添加了它,但它不起作用...

标签: asp.net-mvc asp.net-mvc-4 signalr


【解决方案1】:

目前我无法调试您的代码,但我认为您应该考虑两个可能的问题。

1) 您在启动集线器功能中错过了“$.connection.hub”。当您从服务器端调用接收方法到客户端时,您需要添加“connection.client.received”。应该是这样的:

$(function () {
    var connection = $.connection('/echo');

    connection.client.received(function (data) {
        $('#messages').append('<li>' + data + '</li>');
    });

    $.connection.hub.start().done(function () {
        $("#broadcast").click(function () {
            connection.send($('#msg').val());
        });
    });

});

2) 您需要映射您的持久连接。我相信 signalR 1.x 应该是这样的:

RouteTable.Routes.MapConnection<MyConnection>("echo", "/echo");

但在 SignalR 2.0 中,您需要在集线器 Startup 类中执行以下操作。下面只是一个例子。

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR<MyConnection>("/echo");
        }

【讨论】:

  • 您的第二个建议有效。我只将这一行 app.MapSignalR(); 更改为 app.MapSignalR&lt;MyConnection&gt;("/echo");
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多