[英]SignalR Client not calling Server function
我有以下javascript調用了服務器端signalR集線器。 客戶端代碼
// A simple templating method for replacing placeholders enclosed in curly braces.
if (!String.prototype.supplant) {
String.prototype.supplant = function (o) {
return this.replace(/{([^{}]*)}/g,
function (a, b) {
var r = o[b];
return typeof r === 'string' || typeof r === 'number' ? r : a;
}
);
};
}
$(function () {
var checker = $.connection.LyncPresenceHub, //generated client side proxy hub
available = 'available',
busy = 'busy',
$presenceTable = $('lyncPresence'),
$presenceBody = $presenceTable.find('tbody'),
rowTemplate = '<tr data-id="{Name}"><td><div class="{Status}"></div></td><td><div class="{Name}"></td></tr>';
function formatPresence(lyncUser) {
return $.extend(lyncUser, {
Name: lyncUser.UserName,
Status: lyncUser.Presence
});
}
function init() {
checker.server.GetAllUsers()
.done(function (lyncUsers) {
$presenceTable.empty();
$.each(lyncUsers, function () {
var user = formatPresence(this);
$presenceBody.append(rowTemplate.supplant(user));
});
});
}
//Client side hub method which will be called by the server
checker.client.updateLyncUserPresence = function (LyncUser) {
var displayPresence = formatPresence(LyncUser);
$row = $(rowTemplate.supplant(displayPresence));
$presenceBody.find('tr[data-id=' + LyncUser.Name + ']')
.replaceWith($row);
}
$.connection.hub.start().done(init);
});
SignalR集線器代碼(C#)如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using Oobe.Bobs.Lync.Models;
namespace xxx {
[HubName("LyncPresenceHub")]
public class LyncPresenceHub : Hub
{
private readonly LyncPresenceChecker _lyncpresenceChecker;
public LyncPresenceHub() : this(LyncPresenceChecker.Instance) { }
public LyncPresenceHub(LyncPresenceChecker checker)
{
_lyncpresenceChecker = checker;
}
public IEnumerable<LyncUser> GetAllUsers()
{
return _lyncpresenceChecker.GetAllUsers();
}
}
}
我得到的錯誤如下。 對象不支持屬性或方法“ GetAllUsers”
您的問題是JavaScript中不存在GetAllUsers
。 這是因為,默認情況下,SignalR接受第一個字母,如果大寫則將其小寫。 您可以使用[HubMethodName(string)]
屬性來覆蓋此默認行為,如本文 MSDN所示(並進行解釋):
在客戶端上,代理名稱是集線器類名稱的駝峰式版本。 SignalR自動進行此更改,以便JavaScript代碼可以符合JavaScript約定。
public class ContosoChatHub : Hub
{
[HubMethodName("NewContosoChatMessage")]
public void NewContosoChatMessage(string name, string message)
{
Clients.All.addContosoChatMessageToPage(name, message);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.