2

我是 SignalR 的新手,如果这个问题太明显,我深表歉意,但我在文档中找不到任何答案。

这是我的代码。

/*1*/   actions.client.doActionA = function (result) {
/*2*/           if(result.Success) 
/*3*/               log(result);
/*4*/           // whatever
/*5*/       };
/*6*/       actions.client.doActionB = function (result) {
/*7*/           if(result.Success) 
/*8*/               log(result);
/*9*/           // whatever
/*10*/       };
/*11*/   
/*12*/       // starts the hub
/*13*/       $.connection.hub.start().done(function () { 
/*14*/          // init UI
/*15*/       });
/*16*/   
/*17*/       // ...after some time...
/*18*/       $.connection.actionsHub.server.doActionA(model);
/*19*/   
/*20*/   my ActionsHub declare the methods
/*21*/   
/*22*/           public void DoActionA (MyModel model)
/*23*/           {
/*24*/               // ... do something
/*25*/               Clients.All.doActionA(result);
/*26*/           }
/*27*/           public void DoActionB (MyModel model)
/*28*/           {
/*29*/               // ... do something
/*30*/               Clients.All.doActionB(result);
/*31*/           }

我希望能够在服务器端执行每个命令之后但在客户端执行之前执行一个执行某些操作的函数(即log(result) )。是否有任何选项可以让我这样做,这样我就可以避免为每个 doActionX 首先显式调用日志?

我希望上面的代码变成:

   // AFAIK THIS DOESN'T EXIST, IT'S AN EXAMPLE OF WHAT I'M LOOKING FOR!
   actions.client.done(function(data) { log(data);});

   actions.client.doActionA = function (result) {
      // whatever
   };
   actions.client.doActionB = function (result) {
      // whatever
   };

   // starts the hub
   $.connection.hub.start().done(function () { 
      // init UI
   });

   // ...after some time...
   $.connection.actionsHub.server.doActionA(model);
4

1 回答 1

3

您可以通过集线器管道模块在服务器上执行该功能。Sooo 这是一篇描述它的文章:http ://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#hubpipeline 。

碰巧提供的示例正在记录您正在寻找的内容。如果您想查看调用的结果,可以使用 OnAfterIncoming 覆盖,也可以使用 BuildIncoming。

这是集线器管道模块的基类: https ://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Hubs/Pipeline/HubPipelineModule.cs和相应的文档http:// /msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.hubs.hubpipelinemodule(v=vs.111).aspx

通过客户端上的 SignalR 执行此操作的功能正在进行中:
JS - https://github.com/SignalR/SignalR/issues/1920
C# - https://github.com/SignalR/SignalR/issues/1909

希望这可以帮助!

于 2013-06-26T19:23:13.313 回答