无法在 C# 的 SignalR 1.0 中心解析方法

本文关键字:方法 SignalR | 更新日期: 2023-09-27 18:31:18

我正在努力将我的 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# 中的中心时,我不断遇到"无法解析'JoinGroup'方法"错误。集线器连接处于"已连接"状态,似乎正确。

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一定有什么我忽略了什么,但我无法弄清楚。如果有人能为我指出正确的方向,那就太好了。

感谢。

无法在 C# 的 SignalR 1.0 中心解析方法

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

"异常:无法解析方法"当客户端调用服务器上的方法

此错误可能是由于使用了无法在 JSON 有效负载中发现的数据类型(例如数组)。解决方法是使用 JSON 可发现的数据类型,例如 IList。有关详细信息,请参阅 .NET 客户端无法使用数组参数调用中心方法。

也在您的中心,您的加入组是

public void JoinGroup(string groupname)

但是在您的客户端中,您要添加另一个参数,没有接受 2 个参数的 JoinGroup。

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);

服务器

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>