【问题标题】:How Does SignalR C# Invoke MethodsSignalR C# 如何调用方法
【发布时间】:2013-06-14 17:02:33
【问题描述】:

我想看看是否有人知道 javascript 如何在运行时调用服务器端方法,类似于 SignalR 如何实现这一点。原因是,我想在我的代码中采用这种相同类型的架构来删除最终调用适当方法的 switch 语句。

所以基本上现在我有一个名为 Execute 的 C# WebMethod,它接受一个字符串参数,然后通过开关选择适当的方法。

public void Execute(string Method)
{
    switch (Method)
    {
        case "doThis":
           doThis();
        break;
    }

}

如果有类似的风格从 javascript 动态调用我的 C# 方法,然后调用正确的方法,那就太好了。有什么想法吗?

另外,我希望有人能深入了解,而不仅仅是说“看看源头”。

【问题讨论】:

    标签: c# javascript signalr


    【解决方案1】:

    SignalR C# 如何调用方法

    取决于协议,但假设您的浏览器(和服务器)支持 webSocket 协议:

    您发送(通过 javascript)一条消息:

    var socket = new WebSocket("ws://..."); // 所需的服务器端函数令牌在这里作为参数(+params)

    服务器可以 (fw4.5) 处理此消息,并通过 reflectiondynamic 调用该方法。

    但是,它执行(按设计)有一个捕获 - 异步

    所以这段代码将工作:

    var a=1;
    var b=2;
    var c=myHBub.server.add(a,b);
    alert(c) // undefined.
    

    虽然这个会起作用。:

    var a=1;
    var b=2;
    myHBub.server.add(a,b).done(function (result){alert(result);});
    

    至于它发生在哪里以及如何发生?

    我执行了一个名为“Join”的Js客户端方法:

    这里是核心执行器:

    http://i.stack.imgur.com/jf9Fz.jpg

    【讨论】:

    • 我了解 javascript 端的工作原理,我对服务器端收到此消息时发生的情况更感兴趣。您能否详细介绍一下“反射”和“动态”部分?
    【解决方案2】:

    Drew Marsh 说 SignalR 构建和编译 lambda 表达式以调用 C# 集线器方法是正确的,但这可能比必要的更复杂。您真正需要的只是以下几行的简单反射:

    public void Execute(string Method)
    {
        GetType().GetMethod(Method).Invoke(this, new object[]{});
    }
    

    SignalR 使用编译后的 lambda 表达式来获得更好的性能,但对于您的场景,它可能不是必需的。

    表达式编译的代码已经为 ASP.NET MVC 编写,它被称为 ActionMethodDispatcher,但直到 v1.1.0 才添加到 SignalR。我只看到在MethodInfo.Invoke 上使用表达式编译的基本集线器调用的整体性能提升了约 1%。分析表明,调用 SignalR 集线器方法所花费的大部分时间都花在了 JSON 序列化/反序列化上。

    【讨论】:

      【解决方案3】:

      代码完全开源,你去看看吧?具体来说,您将要开始查看消息进入的HubDispatcher::OnReceived,并一直跟踪您一直到DefaultHubManager,最终您将进入HubMethodDispatcher,魔法一切都发生了.

      您的问题的最终答案是,它使用Expression::Lambda 构建一个lambda 表达式来调用该方法,并通过调用Expression::Compile 将其编译为HubMethodExecutor(IHub, object[]) 类型的强类型委托。

      【讨论】:

        猜你喜欢
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        相关资源
        最近更新 更多