我是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);
答案 0 :(得分: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
希望这有帮助!