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();
},