SignalR - 使用Javascript中心代理

问题描述:

当您使用SignalR,在你的HTML,你需要参考以下两个脚本:SignalR - 使用Javascript中心代理

<script src="~/Scripts/jquery.signalR-1.0.0.js"></script> 
<script src="/signalR/hubs"></script> 

第二个是将为其自动生成一个JavaScript代理枢纽。一切正常。但是,如果JavaScript Hub代理生成以某种方式被禁用,可能通过设置DisableJavaScriptProxies属性(https://github.com/SignalR/SignalR/commit/7e974f4e92551a26f3e3e0a166e1dbf6c064e850)会发生什么情况。当JavaScript代理产生被禁止,并尝试在你的HTML引用/ signalr /集线器,它给人的JavaScript错误:

Uncaught Error: SignalR: JavaScript Hub proxy generation has been disabled. 

当我浏览到浏览器的路径,响应是:

throw new Error('SignalR: JavaScript Hub proxy generation has been disabled.') 

如果JavaScript代代不可用,那么$.connection.myHub.client JavaScript代码将如何工作?我需要做些额外的工作才能使其工作?我得到的JavaScript错误是

Uncaught TypeError: cannot read property 'client' of undefined. 

您可以自己创建代理。见here

这也是在SignalR源内的示例项目中完成的。请参阅MouseTracking示例。 JS它(从here):

/// <reference path="../../Scripts/jquery-1.8.2.js" /> 
/// <reference path="../../Scripts/jquery.signalR.js" /> 

$(function() { 
    var hubConnection = $.hubConnection('/signalr', { qs: 'test=1', logging: false, useDefaultPath: false }), 
     hub = hubConnection.createHubProxy('mouseTracking'); 

    hub.on('move', updateCursor); 

    function updateCursor(id, x, y) { 
     var e = document.getElementById(id); 
     if (!e) { 
      e = $('<div id="' + id + '"><i class="icon-screenshot"></i>' + id + '</div>').appendTo(document.body); 
      e.css('position', 'absolute'); 
     } 
     else { 
      e = $(e); 
     } 
     e.css({ left: x + 15, top: y + 15 }); 
    } 

    hubConnection.logging = true; 
    hubConnection.start({ transport: activeTransport }) 
     .pipe(function() { 
      return hub.invoke('join'); 
     }) 
     .pipe(function() { 
      $(document).mousemove(function (e) { 
       hub.invoke('move', e.pageX, e.pageY); 
       updateCursor(hub.state.id, e.pageX, e.pageY); 
      }); 
     }); 
}); 

你可以在你启动类已禁用它,就像这样:

public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      ConfigureAuth(app); 

      var hubConfiguration = new HubConfiguration(); 
      hubConfiguration.EnableDetailedErrors = true; 
      hubConfiguration.EnableJavaScriptProxies = false; 
      app.MapSignalR("/signalr", hubConfiguration); 
     } 
    } 

我上面的代码。删除/注释掉这一行:hubConfiguration.EnableJavaScriptProxies = false;应该给你代理生成。

public partial class Startup 
     { 
      public void Configuration(IAppBuilder app) 
      { 
       ConfigureAuth(app); 

       var hubConfiguration = new HubConfiguration(); 
       hubConfiguration.EnableDetailedErrors = true; 
       app.MapSignalR("/signalr", hubConfiguration); 
      } 
     } 

对于每个人都在这个问题上绊倒。它似乎是通过设计,甚至SignalR实用程序只生成服务器代理方法。

即使您拥有强类型的Hub(客户端界面),它也不会创建客户端方法。

所以,唯一正确的答案应该是您应该生成微软的小函数。

作为stockticker样品中:

$.connection.hub.start() 
     .then(init) 
     .then(function() { 
      return ticker.server.getMarketState(); 
     }) 
     .done(function (state) { 
      if (state === 'Open') { 
       ticker.client.marketOpened(); 
      } else { 
       ticker.client.marketClosed(); 
      } 

本身被这样 公共类StockTickerHub定义的stockticker:集线器

和接口

public interface IClientStock 
    { 
     void MarketOpened(); 
     void MarketClosed(); 
     void MarketReset(); 
     void UpdateStockPrice(Stock stock); 
    } 

因此,对于每个客户端代理方法,重复这一点。这不应该打破任何机构项目的目标。

$.extend(ticker.client, { 
     updateStockPrice: function (stock) { 
      var displayStock = formatStock(stock), 
       $row = $(rowTemplate.supplant(displayStock)), 
       $li = $(liTemplate.supplant(displayStock)), 
       bg = stock.LastChange < 0 
         ? '255,148,148' // red 
         : '154,240,117'; // green 

      $stockTableBody.find('tr[data-symbol=' + stock.Symbol + ']') 
       .replaceWith($row); 
      $stockTickerUl.find('li[data-symbol=' + stock.Symbol + ']') 
       .replaceWith($li); 

      $row.flash(bg, 1000); 
      $li.flash(bg, 1000); 
     }, 

     marketOpened: function() { 
      $("#open").prop("disabled", true); 
      $("#close").prop("disabled", false); 
      $("#reset").prop("disabled", true); 
      scrollTicker(); 
     },