【问题标题】:Using Asp.Net and SignalR but my server method isn't returning any data?使用 Asp.Net 和 SignalR 但我的服务器方法没有返回任何数据?
【发布时间】:2018-02-05 15:12:07
【问题描述】:

我创建了一个 ASP.NET MVC5 应用程序,后端使用 signalR,前端使用 javascript(主要用于学习)。从功能上讲,它非常简单,它只允许任何连接的客户端查看项目列表,并且每个客户端都可以添加/删除项目。对列表的任何更改都会在所有客户端上异步更新。我已将客户端代码连接到我的集线器,该集线器似乎正在工作(由 console.log 语句确认),但我的服务器方法似乎没有工作,即当我尝试使用 AddItem 方法添加新项目时(),我没有得到更新值的列表。

谁能告诉我我做错了什么?我已将我的代码添加到 GitHub,以便他人查看:https://github.com/mildeveloper/ItemListWebApp/tree/develop

这是我的 javascript 代码:

(function () {
    var itemHub = $.connection.itemHub;

    var updateItemsRetrievedByClient = function (items) {
        console.log("Items obtained by client: " + items.length.toString());
        $("#item-list").empty();
        for (var i = 0; i < items.length; i++) {
            $("#item-list").append("From client: " + items[i] + "<br/>");
        }
    };

    var updateItemsPushedFromServer = function (items) {
        console.log("Items received from server: " + items.length.toString());
        $("#item-list").empty();
        for (var i = 0; i < items.length; i++) {
            $("#item-list").append("From server: " + items[i] + "<br/>");
        }
    };

    $("#submit").on("click",
        function () {
            var text = $("#textname").val();
            itemHub.server.addItem(text)
                .done(function() {
                    console.log("Adding item: " + text);
                })
                .fail(function(e) {
                    console.log(e);
                });

            itemHub.server.getItems()
                .done(function (items) {
                    updateItemsRetrievedByClient(items);
                })
                .fail(function(e) {
                    console.log(e);
                });
        });

    $.connection.hub.start()
        .done(function () {
            console.log("Connected to SignalR hub");
        })
        .fail(function (e) { console.log(e) });

    itemHub.client.itemListUpdated = updateItemsPushedFromServer;
})()

这是我的中心类:

public class ItemHub : Hub
{
    public void AddItem(string item)
    {
        ItemListController.AddItem(item);
        var items = ItemListController.GetItems();
        Clients.All.ItemListUpdated(items);
    }

    public void DeleteItem(string item)
    {
        ItemListController.DeleteItem(item);
        var items = ItemListController.GetItems();
        Clients.All.ItemListUpdated(items);
    }

    public string[] GetItems()
    {
        var items = ItemListController.GetItems();
        return items;
    }
}

【问题讨论】:

  • 如果您能分享您希望我们查看的代码片段,那就太好了。
  • 很多人(包括我自己)不点击问题中的链接,所以对于@hardkoded 的观点,你能包含有用的代码吗?
  • 发布添加项目后console.log的样子
  • 很抱歉没有直接在帖子中发布代码,我以后会这样做。非常感谢。

标签: javascript c# asp.net signalr


【解决方案1】:

您的 ItemsController.cs 中有一个错误

public static void AddItem(string itemName)
{
    lock (ItemNamesLock)
    {
        //if (!itemName.Contains(itemName)) original
        if (!ItemNames.Items.Contains(itemName))
        {
            ItemNames.Items.Add(itemName);
        }
    }
}

【讨论】:

    【解决方案2】:

    首先,您需要删除对getItems 的调用,addItem 正在为您执行此操作。

    然后,您需要在调用start 函数之前注册客户端回调:

    itemHub.client.itemListUpdated = updateItemsPushedFromServer;
    $.connection.hub.start(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多