簡體   English   中英

SignalR客戶端未調用服務器功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM