使用SocketIO4Net将函数回调传递给.NET应用程序中的node.js

时间:2014-05-11 11:29:49

标签: c# javascript node.js socket.io

我想在运行node.js的服务器上调用一个方法。

为此,我将SocketIO4Net.Client添加到我的C#项目中, 但我不知道你通过功能(回调)'通过方法Emit。

我尝试了几件事,但是我总是得到JS Exception' TypeError:object不是函数'。

服务器上的JS(或此处https://github.com/hobbyquaker/ccu.io/blob/master/ccu.io.js#L1756

socket.on('getObjects', function(callback) {
    loggerlogger.verbose("socket.io <-- getObjects");
    callback(regaObjects);
});

客户端代码

public Task<string> GetObject()
{
    Console.WriteLine("Send GetObject");

    var taskCompletionSource = new TaskCompletionSource<string>();

    dynamic doStuffJs = new Action(() => Console.WriteLine("Hello 0"));
    _client.Emit("getObjects", doStuffJs, null, new Action<Object>(Callback));

    return taskCompletionSource.Task;
}

private void Callback(object o)
{
    Console.WriteLine("Hello 1");
}

方法Emit的Doku

/// <summary>
/// <para>Asynchronously sends payload using eventName</para>
/// <para>payload must a string or Json Serializable</para>
/// <para>Mimicks Socket.IO client 'socket.emit('name',payload);' pattern</para>
/// <para>Do not use the reserved socket.io event names: connect, disconnect, open, close, error, retry, reconnect</para>
/// </summary>
/// <param name="eventName"></param>
/// <param name="payload">must be a string or a Json Serializable object</param>
/// <remarks>ArgumentOutOfRangeException will be thrown on reserved event names</remarks>
public void Emit(string eventName, dynamic payload, string endPoint = "", Action<dynamic> callback = null)

1 个答案:

答案 0 :(得分:1)

如果要将某些C#代码序列化从.NET交叉编译为JavaScript,请将其作为JSON数据包内的字符串传递给JavaScript服务器,然后将其解压缩并在服务器上运行(inject code生成通过客户端(不受保护)到服务器处理管道)然后设计中出现了问题。

第一个障碍是Node.js服务器理解JavaScript,而您要发送的代码段是用C#编写的

我建议您重新设计,检查一些典型的客户端 - 服务器方案的Web资源。

如果您对REST-style API不满意,可以考虑使用JSON-RPC

REST vs JSON-RPC?提供了一些较旧的Stack Overflow讨论,其中哪一个更“好”。您可以找到一些有用的链接和相关问题