在C#中的SignalR 1.0集线器中无法解析方法

时间:2014-11-20 15:53:15

标签: c# signalr signalr-hub

我努力将C#代码连接到现有的SignalR集线器。该集线器在SignalR 1.0中创建 我有一个相当直接的情况。集线器定义如下:

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#中的集线器时,我会继续遇到&#34; &#39; JoinGroup&#39;方法无法解决。&#34;错误。 hubConnection在&#34;连接&#34;状态,似乎是正确的。

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。

2 个答案:

答案 0 :(得分:1)

此链接可以帮助您解决许多SignalR问题。 http://www.asp.net/signalr/overview/testing-and-debugging/troubleshooting

“异常:当客户端在服务器上调用方法

时无法解析方法”

使用无法在JSON有效内容中发现的数据类型(如Array)可能会导致此错误。解决方法是使用JSON可发现的数据类型,例如IList。有关更多信息,请参阅.NET Client无法使用数组参数调用hub方法。

另外 在您的集线器中,您的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);

答案 1 :(得分: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);
        }

}

客户端

$(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>