如何在SignalR

时间:2017-05-24 13:36:23

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

我有一个asp.net经典网站。我已经有了SignalR基本功能(一个客户端向其他客户端发送消息)。但现在我只想将消息发送到特定的connectionID。我通过stackoverflow找到了一些解决方案,但它并没有对我的代码起作用。我已经在下面分享了我的c#代码请你们好好看看吧。我的问题是我能够触发集线器方法" Static_Send"但没有办法触发js触发没有响应!任何解决方案,请...

以下是我的中心课程;

public class ChatHub : Hub
{
        private static IHubContext hubContext =       GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
        public static string ConnectionID;

        public void Send( string message, string connectionid)
        {
            Clients.Client(connectionid).addNewMessageToPage(message, connectionid);
        }

        public void SendProxy(string name, string message, string connectionid, IHubContext hubContext)
        {

            hubContext.Clients.All.addNewMessageToPage(name, message, connectionid);
        }

        public override Task OnConnected()
        {
            ConnectionID = Context.ConnectionId.ToString();
            string username = Context.User.Identity.Name;
            return base.OnConnected();
        }
        public static void Static_Send(string message, string connectionid)
        {
            //hubContext.Clients.All.addNewMessageToPage(name, message, connectionid);
            hubContext.Clients.Client(connectionid).addNewMessageToPage(message, connectionid);
          //  hubContext.Clients.All.addNewMessageToPage(message, connectionid);
        }

    }

下面的代码是我的Mvc控制器方法的内容

    public async System.Threading.Tasks.Task<ActionResult> Tetikle()
{    
var hubConnection = new HubConnection("http://localhost:57714");
                var hubProxy = hubConnection.CreateHubProxy("ChatHub");
                await hubConnection.Start();
                var connectionID = hubConnection.ConnectionId;
}

JS代码

    $(function () {
        var parent = window.parent.document.body;
        var chat = $.connection.chatHub;

       // $.connection.hub.start();

        chat.client.addNewMessageToPage = function (message, connectionid) {
            debugger;
            console.info("11"+connectionid);
            $('.dropdown-menu .listview .lv-body', parent).prepend('<a class="lv-item" href="#">' +
                                                             '<div class="media">' +
                                                             '<div class="pull-left">' +
                                                             '<img class="lv-img-sm" src="img/profile-pics/1.jpg" alt="">' +
                                                             '</div>' +
                                                             ' <div class="media-body">' +
                                                             '<div class="lv-title">E-imza</div>' +
                                                             '<small class="lv-small">' + message + '</small>' +
                                                             '</div>' +
                                                             '</div>' +
                                                             '</a>');


        };
        $.connection.hub.start().done(function () {
            debugger;
        });

    });
    function htmlEncode(value) {
        var encodedValue = $('<div />').text(value).html();
        return encodedValue;
    }



    //});

在另一个MVC控制器中调用静态方法

[HttpPost]
        public ActionResult BasvuruCreate(Ruhsat model)
        {
ChatHub.Static_Send("aa", item.identity);

}

1 个答案:

答案 0 :(得分:0)

您需要关注:

  1. 服务器上用于向具有客户端ID的单个客户端发送消息的方法。这与sendProxy类似,但这次需要选择connectionID而不是ALL(或者对于signalR 2.0,你可以使用传递给它的iUserIdProvider as stated here by example
  2. 您可以在客户端上使用AddMessagetoPage函数添加消息,也可以使用不同的方法添加私人用户消息。
  3. 如果您了解发送和阅读https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections的周期,您会发现connectionID可能不是最好保留,并且您拥有用户名或某些内容然后会解析为客户端ID,然后您发送消息给他们。您可以使用连接ID尝试此操作,以至少解决代码使用已知连接ID的问题。

    你有OnConnected方法,你已经获得了connectionID和username,但你没有将它存储在任何地方,所以如果用户从手机和桌面连接,用户名相同但连接ID不同。同样,如果用户从chrome和IE登录,则您将拥有两个连接ID和一个用户名。您需要解决此问题,以便从用户名获取连接ID数组,然后调用客户端方法将任何您想要的内容发送到该集线器。