2013-06-18 2 views
4

Я ищу, чтобы узнать, знает ли кто-нибудь, как javascript может вызывать методы на стороне сервера во время выполнения, аналогично тому, как SignalR достигает этого. Причина в том, что я хотел бы использовать этот тип архитектуры в моем коде для удаления операторов switch, которые в конечном итоге вызывают соответствующие методы.Как методы SignalR C# вызывают

Итак, теперь у меня есть C# WebMethod с именем Execute, и он принимает строковый параметр, который затем выбирает соответствующий метод через коммутатор.

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

} 

Было бы неплохо иметь подобный стиль динамически вызов мои C# метод из яваскрипта и правильный метод, то вызывается. Есть идеи?

Также я надеюсь, что кто-то может углубиться, кроме как просто сказать: «Посмотрите на источник».

ответ

3

Как работает SignalR C# вызов методов

В зависимости от протокола, но позволяет сказать, что ваш браузер (и сервер) Поддержка протокола WebSocket:

Вы отправить (через JavaScript) сообщение:

var socket = new WebSocket("ws://..."); // требуется на стороне сервера функция маркера здесь как PARAM (+ Params)

ремонт лежит er can (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);}); 

Что касается того, где это происходит и как?

Я выполнил клиент мето Js с именем "Регистрация":

и здесь является основным исполнителем:

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

enter image description here

+0

Я понимаю, как работает javascript, меня больше интересует, что происходит на стороне сервера, когда оно получает это сообщение. Не могли бы вы подробнее рассказать о «отражении» и «динамических» частях? – cgatian

0

Код является полностью открытым исходным кодом, почему Дон» Ты хочешь посмотреть? В частности, вы захотите начать поиск в HubDispatcher::OnReceived, где будут входить сообщения и проследить, что вы пройдете путь через DefaultHubManager, и в конечном итоге вы сделаете так, чтобы вы дошли до HubMethodDispatcher, где все волшебство происходит.

В конечном счете, ответ на ваш вопрос в том, что он строит лямбда-выражения, используя Expression::Lambda, чтобы вызвать метод и компилирует, что в сильно типизированных делегат типа HubMethodExecutor(IHub, object[]) путем вызова Expression::Compile.

1

Drew Marsh прав, что SignalR строит и компилирует лямбда-выражения для вызова методов хаба C#, но это, вероятно, сложнее, чем то, что необходимо. Все, что вам действительно нужно, это просто отражение по следующим направлениям:

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

SignalR использует скомпилированные лямбда-выражений, чтобы получить более высокую производительность, но для вашего сценария может не потребоваться.

Код для компиляции выражения уже был написан для ASP.NET MVC, где он называется ActionMethodDispatcher, но он не был добавлен в SignalR до версии 1.1. Я видел только прирост производительности на 1% для базового вызова хаба, используя компиляцию выражения над MethodInfo.Invoke. Профилирование показало, что большую часть времени, затрачиваемого на использование методов концентратора SignalR, тратится на сериализацию/десериализацию JSON.

Смежные вопросы