无法在 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一定有什么我忽略了什么,但我无法弄清楚。如果有人能为我指出正确的方向,那就太好了。
感谢。
此链接可帮助解决许多 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>