4

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

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

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

}

最好有类似的风格从 javascript 动态调用我的 C# 方法,然后调用正确的方法。有任何想法吗?

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

4

3 回答 3

3

SignalR C# 如何调用方法

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

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

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

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

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

所以这段代码不起作用

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

在此处输入图像描述

于 2013-06-18T13:10:16.827 回答
1

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 序列化/反序列化上。

于 2013-06-18T18:36:10.237 回答
0

代码完全开源,何不去看看?具体来说,您将希望开始查看消息进入的HubDispatcher::OnReceived并跟踪您一直通过DefaultHubManager并最终您将进入HubMethodDispatcher魔法一切发生的地方。

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

于 2013-06-18T16:28:46.867 回答