SignalR 2.0.2创建PersistentConnection

时间:2014-02-02 15:50:42

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

我使用包管理器控制台将SignalR 2.0.2安装到我的MVC 4.5应用程序中。我做了连接配置的标准示例。

namespace SignalRPersistent
{

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

问题是MapSignalR方法不接受字符串,而编译错误则表示

参数类型字符串不能分配给参数类型SignalRHubConfiguration。但我可以看到一个接受字符串的重载方法,但它坚持不编译。有什么问题?

2 个答案:

答案 0 :(得分:4)

我改变了下面的代码并开始工作。

app.MapSignalR<ConnectionHub>("/echo");

ConnectionHub 是从PersistentConnection继承的类。互联网上的例子不需要指定课程,但它们对我没有用。

答案 1 :(得分:3)

好的,Ryu提供的解决方案是正确的 - 但可能会让许多人感到困惑。说实话,我还没有找到一个演练(使用完全相同的代码作为示例) - 但没有任何效果,部分原因是随着信号器项目的推进,许多东西变得过时。

所以,你有一个扩展 PersistentConnection 的类,在这个类中你有所有的任务(OnConnected,OnReceived等):

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

public class MyAwesomeConnection : PersistentConnection
{
    protected override Task OnConnected(IRequest request, string connectionId)
    {
        var fromClient = request.QueryString["testQuery"];

        return base.OnConnected(request, connectionId);
    }


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

然后你&#34;映射&#34; OwinStartup类中的那个类(在本例中为 MyAwesomeConnection ):

using DataCommunication;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(SignalRServer.Startup))]
namespace SignalRServer
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR<MyAwesomeConnection>("/server");
        }
    }
}

现在你可以使用javascript连接了,在引用jquery和jquery.signalR脚本时要非常小心。首先是jquery,然后是jquery.signalR,然后是所有其他使用signalR东西的脚本,并避免使用@ Scripts.Render(&#34; bundles / jquery&#34;)。只是用旧时尚的方式做到:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>    
    <script type="text/javascript" src="Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="Scripts/jquery.signalR-2.1.1.min.js"></script>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>

<script>
    var connection = $.connection("/server", "testQuery=This crap finally works", true);
    connection.start();
</script>

@RenderBody()    

@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)

</body>
</html>

在MyAwesomeConnection类的OnConnected内部设置一个断点,并读出变量 fromClient ,一旦客户端(javascript)连接,它就会触发。它应该有希望读出来&#34;这个废话最终有效&#34;。

现在你应该好好用signalR构建一些引人注目的东西,如果某些东西仍然不起作用 - 那么你要么缺少nuget中的一些程序集,要么缺少项目中未正确设置的引用。