2014-11-20 1 views
1

Я изо всех сил пытаюсь подключить свой код C# к существующему концентратору SignalR. Этот концентратор создан в SignalR 1.0
У меня довольно прямая ситуация. Втулка определяется следующим образом:Метод не может быть разрешен в концентраторе SignalR 1.0 в C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Microsoft.AspNet.SignalR.Hubs;  

namespace POC.SignalR.WebHost.Hubs 
{ 
     [HubName("SignalRHub")] 
     public class SignalRHub : Hub 
     { 
      /// <summary> 
      /// Joins the group. 
      /// </summary> 
      /// <param name="groupname">The groupname.</param> 
      public void JoinGroup(string groupname) 
      { 
       Groups.Add(Context.ConnectionId, groupname); 
       Clients.OthersInGroup(groupname).newMemberMessage(Context.ConnectionId); 
       Clients.Caller.JoinedGroup(groupname); 
      } 

Когда я подключаюсь к концентратору, используя Javascript, все это работает как шарм.

// Check if url exists and give it a default value if that's the case. 
if (!url) { url = 'http://www.someurl.com/signalr'; } 

conn = $.connection.SignalRHub; 
var currentGroupName = ''; 
if (typeof groupName == "string") currentGroupName = groupName; 

$.connection.hub.url = url; 
$.connection.hub.logging = true; 

// Start the connection 
$.connection.hub.start().done(function() { 
    verbosemsg(conn.connection.state); 
    conn.server.connectionName();// init to get my connectioID 
    verbosemsg('Connection made now joining group:' + currentGroupName); 
    if (currentGroupName != '') conn.server.joinGroup(currentGroupName); 
});  

Но при подключении к концентратору в C#, используя следующий код, я постоянно бегаю в «метод„JoinGroup“не может быть решена.» ошибка. HubConnection находится в состоянии «подключено» и кажется правильным.

HubConnection hubConnection = new HubConnection("http://www.someurl.com/signalr", false); 
IHubProxy hubProxy = hubConnection.CreateHubProxy("SignalRHub"); 
hubConnection.Start().Wait(); 
hubProxy.Invoke("JoinGroup", hubConnection.ConnectionId, "SignalRChatRoom").Wait(); 

Насколько я могу видеть, я реализовал свой код, аналогичный как можно заметить на этом примере: http://www.asp.net/signalr/overview/older-versions/signalr-1x-hubs-api-guide-net-client#establishconnection Там должно быть что-то я упускать из виду, но я не могу понять это. Было бы здорово, если бы кто-то мог указать мне в правильном направлении.

Thx.

+0

Не следует ли URL быть «HTTP: //www.someurl.com/signalr/hub?» Если вы просто запустите «http://www.someurl.com/signalr» в своем браузере, что вы видите? Вы видите сгенерированный прокси? – Gjohn

+1

вы вызываете метод «JoinGroup» с двумя параметрами, в то время как методы на сервере принимают только параметр - имя группы. Это должно работать: 'hubProxy.Invoke (« JoinGroup »,« SignalRChatRoom »);'. Также вы не должны использовать '.Wait()', но 'await', иначе вы можете иметь взаимоблокировки. – Pawel

ответ

1

Эта ссылка может помочь решить проблему с несколькими проблемами SignalR. http://www.asp.net/signalr/overview/testing-and-debugging/troubleshooting

«Исключение: метод не может быть решена», когда клиент вызывает метод на сервере

Эта ошибка может возникнуть в результате использования типов данных, которые не могут быть обнаружены в полезной нагрузке JSON, такие как Array. Обходным путем является использование типа данных, который может быть обнаружен JSON, например IList. Дополнительные сведения см. В статье .NET Client, неспособной вызвать методы хаба с параметрами массива.

Также В хаба ваш JoinGroup является

public void JoinGroup(string groupname) 

, но в клиенте вы добавляете еще один аргумент, нет JoinGroup, которая принимает 2 аргумента.

hubProxy.Invoke("JoinGroup", hubConnection.ConnectionId, "SignalRChatRoom").Wait(); 

// Summary: 
//  Executes a method on the server side hub asynchronously. 
// 
// Parameters: 
// method: 
//  The name of the method. 
// 
// args: 
//  The arguments 
// 
// Type parameters: 
// T: 
//  The type of result returned from the hub 
// 
// Returns: 
//  A task that represents when invocation returned. 
Task<T> Invoke<T>(string method, params object[] args); 
0

Сервер

public class ChatHub : Hub 
{ 

     public int TryAddNewUser(string userName) 
     { 
      //some logic... 
      Clients.All.AddUserToUserList(id, userName); 
      return id; 
     } 

     public void AddNewMessageToPage(int id, string message) 
     { 
      //some logic... 
      Clients.All.addNewMessageToPage(u.Login, message); 
     } 

} 

Client

$(document).ready(function() { 
    //first need register client methods 
    var chat = $.connection.chatHub; 
    chat.client.addUserToUserList = function (id, login) { 
     //client logic for add new user 
    } 

    chat.client.addNewMessageToPage = function (login, message) { 
     //client logic for add new message from user 
    } 

    //second need start chat 
    $.connection.hub.start().done(function() { 
     chat.server.tryAddNewUser(login).done(function (id) { 
      alert("Added " + id) 
     }); 
    }); 

}); 

Обратите внимание, динамический JS файл должен быть добавлен с тем же путем

<script type="text/javascript" src="~/signalr/hubs"></script>