【问题标题】:Method cannot be resolved in SignalR 1.0 hub in C#方法无法在 C# 的 SignalR 1.0 集线器中解析
【发布时间】:2014-11-20 15:53:14
【问题描述】:

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

谢谢。

【问题讨论】:

  • 网址不应该是“someurl.com/signalr/hub”吗?如果您只是在浏览器中启动“someurl.com/signalr”,您会看到什么?你看到生成的代理了吗?
  • 您正在使用两个参数调用JoinGroup 方法,而服务器上的方法只使用参数 - 组名。这应该有效:hubProxy.Invoke("JoinGroup", "SignalRChatRoom");。另外你不应该使用.Wait(),而是await,否则你可能会出现死锁。

标签: c# signalr signalr-hub


【解决方案1】:

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

客户端调用服务器上的方法时出现“异常:方法无法解析”

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

还有 在您的中心,您的 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);

【讨论】:

    【解决方案2】:

    服务器

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多