我希望看看是否有人知道javascript如何在运行时调用服务器端方法,类似于SignalR如何实现这一点。原因是,我想在我的代码中采用这种相同类型的体系结构来删除最终调用适当方法的switch语句。
所以基本上我现在有一个名为Execute的C#WebMethod,它接受一个字符串参数,然后通过一个开关选择合适的方法。
public void Execute(string Method)
{
switch (Method)
{
case "doThis":
doThis();
break;
}
}
从javascript动态调用我的C#方法的类似风格会很好,然后调用正确的方法。有什么想法吗?
此外,我希望有人可以深入了解,除了说“看看来源”。
答案 0 :(得分:3)
SignalR C#如何调用方法
取决于协议,但是假设您的浏览器(和服务器)支持webSocket协议:
您发送(通过javascript)消息:
var socket = new WebSocket("ws://...");
//所需的服务器端功能令牌在这里作为参数(+ params)
服务器可以(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
答案 1 :(得分:1)
Drew Marsh说得对,SignalR构建并编译一个lambda表达式来调用C#hub方法,但这可能比必要的更复杂。您真正需要的只是简单的反思,如下所示:
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序列化/反序列化。
答案 2 :(得分:0)
代码是完全开源的,你为什么不去看看?具体来说,您需要开始查看消息所在的HubDispatcher::OnReceived,并在DefaultHubManager一直跟踪您的情况,最终您将进入HubMethodDispatcher魔法全部发生的地方。
最终你的问题的答案是它使用Expression::Lambda
构建一个lambda表达式来调用该方法并通过调用Expression::Compile
将其编译为类型为HubMethodExecutor(IHub, object[])
的强类型委托。