2017-02-08 3 views
0

У меня есть одна версия R 2.2.1. я реализую пользовательского идентификатор поставщикsignalr Clients.Users (userIds) .send (msg) не работает

public class ChatUserIdProvider : IUserIdProvider 
{ 
    public string GetUserId(IRequest request) 
    { 
     if (request.User.Identity.IsAuthenticated) 
     { 
      Guid.Parse(request.User.Identity.GetUserId().ToString()); 
      var userId = request.User.Identity.GetUserId().ToString(); 
      return userId.ToString(); 
     } 
     return "Un Known"; 
    } 
} 

Я сделал простое приложение чата и каждый думает нормально, но когда я пытаюсь отправить сообщение для нескольких пользователей события клиента не стреляющих здесь функция ступицы

public void SendToMany(string msg, List<string> userIds) 
    { 
     try 
     { 
      //db things here 
      Clients.Users(userIds).sendMessage(msg); 
     } 
     catch (Exception ex) 
     { 
      Logs.Log(ex); 
     } 
    } 

Startup

GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new ChatUserIdProvider()); 
     app.MapSignalR(); 

Js

$(function() { 
    var chat = $.connection.chatHub; 
    chat.client.sendMessage= function (msg) { 
     $('.msgs').append('<div>'+ group.Name + '</div>'); 
     $('#' + group.Id).click(); 
    } 
    $.connection.hub.start(); 

}) 

function BrodCast() { 
    try { 

     var chatids = new Array(); 
     $('.ckusergr').each(function() { 
      if ($(this).is(':checked')) { 
       chatids.push($(this).attr('iid')); 
      } 
     }) 
     chat.server.sendToMany($('.txtmsg').val(), chatids); 
    } catch (e) { 
     console.log(e) 
    } 
} 

проблема с этой линией

public void SendToMany(string msg, List<string> userIds) 
    { 
     try 
     { 
      //db things here 
      Clients.Users(userIds).sendMessage(msg); // Her is the Problem 
     } 
     catch (Exception ex) 
     { 
      Logs.Log(ex); 
     } 
    } 

если я изменить, чтобы стать, как этого каждая вещь работы большой.

public void SendToMany(string msg, List<string> userIds) 
    { 
     try 
     { 
      //db things here 
      foreach (string item in userIds) 
      { 
       Clients.User(item).sendMessage(msg); 
      } 
     } 
     catch (Exception ex) 
     { 
      Logs.Log(ex); 
     } 
    } 
+0

'Clients.User' работает с идентификатором пользователя, который является строкой. он не работает со списком строки. поэтому вам нужно использовать foreach для его работы. Я не уверен, как вы его проектируете, но вы можете рассмотреть возможность использования 'Clients.All'. он автоматически отправит сообщение всем онлайн-клиентам. – Mark

+0

вы работаете 'Clients.User' со строкой' user Id', но я пытаюсь использовать 'Clients.Users', который принимает список идентификаторов пользователей. – Bakri

ответ

1
  • Во-первых, вам нужно, чтобы начать свой hub до объявления 'отправить' функцию.
  • Во-вторых, вы должны поместить свой Broadcast function в основную функцию, которая объявляет переменную чат.

что-то, как это должно работать:

$(function() { 
    var chat = $.connection.chatHub; 
    chat.client.sendMessage= function (msg) { 
     $('.msgs').append('<div>'+ group.Name + '</div>'); 
     $('#' + group.Id).click(); 
    } 
    $.connection.hub.start().done(function() { 
     var chatids = new Array(); 
     $('.ckusergr').each(function() { 
      if ($(this).is(':checked')) { 
       chatids.push($(this).attr('iid')); 
      } 
     }) 
     chat.server.sendToMany($('.txtmsg').val(), chatids); 
    }); 
}) 
+0

. Я уже запускаю концентратор , но я забыл отправить вопрос. Я также попытался установить функцию широковещания внутри основной функции, но то же самое, функция sendMessage не запускается. I Редактировать вопрос, чтобы быть более ясным – Bakri

1

У меня была аналогичная проблема сегодня, и я узнаю, когда я посылаю в качестве параметра List<string>, который содержит все имена пользователей Into Clients.Users(list of usernames) так или иначе он будет работать также.

Я нашел это случайно, может быть, кто-то с более опытом может пояснить, почему это работает, поскольку это должно принимать только IList<string> userIds

+1

'IList ' является интерфейсом, а 'List ' является классом Inherit от IList, поэтому параметр примет весь класс, который унаследован от 'IList ' – Bakri

+1

Спасибо за объяснение – Martin