Signalr Owin简单示例javascript客户端未被调用 [英] Signalr Owin simple example javascript client not being called

查看:90
本文介绍了Signalr Owin简单示例javascript客户端未被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个5.3.0版本的Signalr自托管,该版本正在升级到一个较新的Signalr版本. 使用 https://github.com/SignalR/SignalR/wiki/Self-host示例我创建了一个简单的示例,但是我无法使其正常工作.

I have a 5.3.0 version of signalr self hosting that is being upgraded to a newer version of signalr. Using https://github.com/SignalR/SignalR/wiki/Self-host example i have created a simple example, but i can’t get it to work.

我可以连接到服务器上的集线器并在集线器上调用方法,但是我无法使集线器调用javascript客户端.

I can get a connection to the hub on the server and call methods on the hub, but i can’t get the hub to call the javascript client.

在提琴手中看着它时,我再也没有看到来自集线器的响应.

When looking at it in fiddler I never see a response come back from the hub.

这是代码

using System;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Hosting;
using Owin;



namespace ConsoleApplication3
{
class Program
{
    static void Main(string[] args)
    {
        string url = "http://localhost:8080/";

        using (WebApplication.Start<Startup>(url))
        {
            Console.WriteLine("Server running on {0}", url);
            Console.ReadLine();
        }
    }
}
}

using Microsoft.AspNet.SignalR;
using Owin;

namespace ConsoleApplication3
{
  class Startup
  {
    // This method name is important
    public void Configuration(IAppBuilder app)
    {
        var config = new HubConfiguration
        {
            EnableCrossDomain = true,
            EnableJavaScriptProxies = true
        };

        app.MapHubs(config);
    }

  } 

}

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

namespace ConsoleApplication3.Hubs
{
public class Chat : Hub
{

    public override Task OnConnected()
    {
        Notify(Context.ConnectionId);
        return new Task(() => { });
    }

    public void RunTest()
    {
        Notify(Context.ConnectionId);
    }


    public void Notify(string connectionId)
    {
        dynamic testMessage = new
        {
            Count = 3,
            Message = "Some test message",
            Timestamp = DateTime.Now
        };

        String json = JsonConvert.SerializeObject(testMessage);

        var context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
        context.Clients.Client(connectionId).sendNotification(json);
    }

 }
}

这是客户端

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>
<title></title>     
    <script src="Scripts/json2.js"></script>
    <script src="Scripts/jquery-1.9.1.js"></script>
    <script src="Scripts/jquery.signalR-1.0.1.js"></script>
    <script src="http://localhost:8080/signalr/hubs"></script>

<script>         
    $(function () {

        // Proxy created on the fly
        var notification = $.connection.chat;
        $.connection.hub.logging = true;

        // Declare functions that can be run on the client by the server
        notification.client.sendNotification = onAddNotification;
        notification.client.disconnected = function (connectionid) {
            console.log(connectionid);
        };
        // Testing code only
        $("#testButton").click(function () {
            // Run test function on server
            notification.server.runTest();
        });

        jQuery.support.cors = true;

        // Map the onConnect and onDisconnect functions
        notification.client.connected = function () {
            alert("Notification system connected");
        };
        notification.client.disconnected = function () { };
        $.connection.hub.url = "http://localhost:8080/signalr";

        //$.connection.hub.start();
        $.connection.hub.start(function () {
            alert("Notification system connected");
        });

    });

    // Process a newly received notification from the server
    function onAddNotification(message) {

        // Convert the passed json message back into an object
        var obj = JSON.parse(message);

        var parsedDate = new Date(parseInt(obj.Timestamp.substr(6)));

        // Update the notification list
        $('#notifications').prepend('<li>' + obj.Message + ' at ' + parsedDate + '</li>');

    };

    </script> 
</head> 
<body>     
    <a href="javascript:void(0)" class="btn" id="testButton">Send test</a>     
    <ul class="unstyled" id="notifications">             
    </ul> 
</body>

任何想法都将不胜感激,因为我很受困.

Any ideas would be appreciated, since i am fairly stuck.

推荐答案

代码中的几件事:

更改此:

public override Task OnConnected()
{
    Notify(Context.ConnectionId);
    return new Task(() => { });
}

收件人:

public override Task OnConnected()
{
    Notify(Context.ConnectionId);
    return base.OnConnected();
}

也在您的中心:

此功能正在尝试:

public void Notify(string connectionId)
{
    dynamic testMessage = new
    {
        Count = 3,
        Message = "Some test message",
        Timestamp = DateTime.Now
    };

    String json = JsonConvert.SerializeObject(testMessage);

    var context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
    context.Clients.Client(connectionId).sendNotification(json);
}

我什至不确定为什么要传递连接ID(也许是静态的?)

I'm not even sure why you're passing the connection id (maybe it was meant to be static?)

public void Notify()
{
    dynamic testMessage = new
    {
        Count = 3,
        Message = "Some test message",
        Timestamp = DateTime.Now
    };

    Clients.Client(Context.ConnectionId).sendNotification(testMessage);
}

您不需要序列化两次,我们已经为您完成了.

You don't need to serialize twice, we already do it for you.

删除:

jQuery.support.cors = true;

永远不要设置它.

也:

// Map the onConnect and onDisconnect functions
notification.client.connected = function () {
    alert("Notification system connected");
};

notification.client.disconnected = function () { };

这些没有映射任何客户端.您无法将已连接和已断开连接的服务器映射到客户端.客户有自己的事件.

These aren't mapping anything client side. You can't map connected and disconnected from the server to the client. The client has its own events.

其他事项:

这应该在启动回调中,这样您就可以在未准备好之前就不打它:

This should be inside of the start callback so that you don't hit it before it's ready:

$.connection.hub.start().done(function() {
    // Testing code only
    $("#testButton").click(function () {
        // Run test function on server
        notification.server.runTest();
    });
});

这篇关于Signalr Owin简单示例javascript客户端未被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆