【问题标题】:SignalR Invoke issueSignalR 调用问题
【发布时间】:2014-01-31 07:48:21
【问题描述】:

我使用 signalR android 实现:https://github.com/erizet/SignalA,但我在使用它时遇到了一些问题。

我像这样初始化我的 HubConnection:

String url = "http://www.myurl.com";
con = new HubConnection(url, getActivity(), new LongPollingTransport())
{
    @Override
    public void OnStateChanged(StateBase oldState, StateBase newState) {
        switch(newState.getState())
        {
        case Connected:

            ArrayList<String> test = new ArrayList<String>();
            test.add("header");
            test.add("0");
            test.add("data");
            test.add("pleyh");

            hub.Invoke("SendConnection", test, new HubInvokeCallback() {

                @Override
                public void OnResult(boolean arg0, String arg1) {
                    Log.i("HubConnection", "On result: arg0 = " + arg0 + " arg1 = " + arg1);
                }

                @Override
                public void OnError(Exception arg0) {
                    Log.i("HubConnection", "On error: arg0 = " + arg0.getMessage());
                }
            });
            break;
        case Disconnected:
            Log.i("HubConnection", "Disconnected");
            stopSignalA();
            break;
        default:
            break;
        }
    }

之后,我初始化我的 HubProxy 并开始连接:

try {
    hub = con.CreateHubProxy("GameManager");

} catch (OperationApplicationException e) {
    e.printStackTrace();
}
hub.On("addNewMessageToPage", new HubOnDataCallback() 
{
    @Override
    public void OnReceived(JSONArray args) {
        Log.i("HubConnection", "OnReceived " + args.toString());
        for(int i=0; i<args.length(); i++)
        {
            Log.i("HubConnection", "OnReceived -> addNewMessageToPage = " + args.opt(i).toString());
        }
    }
});
con.Start();

似乎一切正常,因为协商成功并且我收到了带有 ConnectionToken 的 JSON。问题是当我收到 OnStateChanged 时执行调用,当我知道我已连接时,

我收到了这个错误:

{"I":"0","E":"'SendConnection' method could not be resolved.","T":"   at

Microsoft.AspNet.SignalR.Hubs.NullMethodDescriptor.b_0(IHub emptyHub, Object[] emptyParameters)\r\n at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming(IHubIncomingInvokerContext context)\r\n--- 从上一个位置结束堆栈跟踪,其中 抛出异常 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 Microsoft.AspNet.SignalR.Hubs.HubPipelineModule.c_DisplayClass1.0>d_3.MoveNext()"}

这是我发送到服务器的内容:

{"H":"gamemanager","A":["header","0","data","user"],"M":"SendConnection","I":"0"}

错误表明方法“SendConnection”不存在,但确实存在。有人已经有这个问题了吗?还是我的代码有问题?提前致谢!

编辑 1:

Hub 上的定义和方法定义:

public class GameManager : Hub
    {
        [HubMethodName("sendConnection")]
        public void SendConnection(string Json)
        {
            Clients.Client(Context.ConnectionId).addNewMessageToPage("[SendConnection] Connection Established: " + Json);
        }

        [HubMethodName("sendToRoom")]
        public void SendToRoom(string message)
        {
            Clients.Group(FindRoomFromConnectionId()._room).addNewMessageToPage("[sendToRoom]: " + message);
        }
    }

【问题讨论】:

    标签: c# java android signalr


    【解决方案1】:

    您能否粘贴您尝试调用的代码。似乎您正在调用的方法名称有问题。还要给出 hub 方法定义。

    【讨论】:

    • 我也试试 hub.Invoke("sendConnection" ...);但它是一样的。
    • 从错误信息 "{"I":"0","E":"'SendConnection' 方法无法解析。","T":" at" 我可以看到你正在调用 PascalCase 中的方法名称。您可以尝试将它们更改为驼峰式,因为您已经定义了方法名称吗?应该可以解决问题
    • 你的意思是 hub.Invoke("sendConnection", ...); 吗?我已经试过了。
    【解决方案2】:

    我认为您在调用 sendConnection 时使用了太多参数。尝试将您的代码更改为以下内容:

            ArrayList<String> test = new ArrayList<String>(1);
            test.add("only one argument");
    

    【讨论】:

    • 服务器需要有“header”和“data”的值。那么我该如何进行呢?
    • 首先,确认这是问题所在。那么最简单的解决方案是更改您的 GameManager hub。更改为 SendConnection(string header, string data) eg.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多