我努力将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。
答案 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>