C# 使用Signalr、asp.net Core和sql依赖项注入在浏览器上显示实时数据库更改

C# 使用Signalr、asp.net Core和sql依赖项注入在浏览器上显示实时数据库更改,c#,asp.net-core,signalr-hub,sqldependency,asp.net-core-signalr,C#,Asp.net Core,Signalr Hub,Sqldependency,Asp.net Core Signalr,您好,我对SignalR和asp.net core非常陌生,我的根本问题是,我希望用户能够实时查看对数据库所做的更改。我有一个使用signalr和asp.net框架的代码示例,但是当我尝试将其转换为asp核心时,由于我的集线器,它失败了。我很确定这个问题很简单,但是网上的其他一些例子超出了我目前的深度 cushub.cs: public class CusHub : Hub { public static void Show() {

您好,我对SignalR和asp.net core非常陌生,我的根本问题是,我希望用户能够实时查看对数据库所做的更改。我有一个使用signalr和asp.net框架的代码示例,但是当我尝试将其转换为asp核心时,由于我的集线器,它失败了。我很确定这个问题很简单,但是网上的其他一些例子超出了我目前的深度

cushub.cs:

public class CusHub : Hub
    {
        public static void Show()
        {
           //The below code is what doesn't work in aspcore. This is what i'm struggling with.
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<CusHub>();
            context.Clients.All.displayCustomer();
        }
    }
customercontroller.cs

public JsonResult Get()
{

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand(@"SELECT [Id],[CustId],[CustName] FROM [dbo].[ad.signalr] WHERE [Status] <> 0", connection))
        {
            command.Notification = null;

            SqlDependency dependency = new SqlDependency(command);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            if (connection.State == ConnectionState.Closed)
                connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            var listCus = reader.Cast<IDataRecord>()
                    .Select(x => new
                    {
                        Id = (int)x["Id"],
                        CusId = (string)x["CustId"],
                        CusName = (string)x["CustName"],
                    }).ToList();

            return Json(new { listCus = listCus });

        }
    }
}

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
    CusHub.Show();
}
客户视图

@Html.Hidden("Get", Url.Action("Get", "Customer"))

<table class="table">
    <thead>
        <tr>
            <th>Id</th>
            <th>Customer Id</th>
            <th>Customer Name</th>
        </tr>
    </thead>

    <tbody id="tblInfo"></tbody>
</table>
signarjs文件

$(function () {

    var cus = $.connection.cusHub;

    cus.client.displayCustomer = function () {
        getData();
    };

    $.connection.hub.start();
    getData();
});

function getData() {
    var $tbl = $('#tblInfo');
    $.ajax({
        url: $("#Get").val(),
        type: 'GET',
        datatype: 'json',
        success: function (data) {
            $tbl.empty();

            $.each(data.listCus, function (i, model) {
                $tbl.append
                    (
                        '<tr>' +
                        '<td>' + model.Id + '</td>' +
                        '<td>' + model.CusId + '</td>' +
                        '<td>' + model.CusName + '</td>' +
                        '<tr>'
                    );
            });
        }
    });
}
除了在我的hub中,代码不会抛出任何异常。 与:

GlobalHost.ConnectionManager.GetHubContext<CusHub>()
context.Clients.All.displayCustomer();


Iclientproxy does not contain a definition for displayCustomer();
我知道SignalCore已经做了一些更改,但是有没有一个简单的方法可以让它运行起来

以上代码在asp.net框架中工作

感谢您的帮助

如果您有displayCustomer方法,我想您正在使用。查看该文档中的示例,这将使您走上正确的道路。但我马上就看到了几个问题:

首先,您需要将CusHub的声明更改为派生自Hub,其中T是您用来定义SignalR客户端将接受的方法的接口。所以,如果这被称为ICusHub,那么你会有这样的东西:

public class CusHub : Hub<ICusHub>
如果您有displayCustomer方法,我假设您正在使用。查看该文档中的示例,这将使您走上正确的道路。但我马上就看到了几个问题:

首先,您需要将CusHub的声明更改为派生自Hub,其中T是您用来定义SignalR客户端将接受的方法的接口。所以,如果这被称为ICusHub,那么你会有这样的东西:

public class CusHub : Hub<ICusHub>

你说它抛出异常,但你没有告诉我们异常是什么。当你遇到异常时,请具体说明-将其编辑到你的问题中。你说它抛出异常,但你没有告诉我们异常是什么。当你得到一个例外时,请具体一点——把它编辑成你的问题。谢谢你给我指出了正确的方向。非常感谢。我现在已连接到中心。但是,我在客户端不断收到关于:con.client.displaycuster=function的异常{。它在promise TypeError中返回了未捕获的错误:无法设置未定义的属性'DisplayCustomer'。我这样做是否错误?这说明con.client未定义。感谢您为我指出正确的方向。非常感谢。我现在已连接到中心。但是,我在ref中不断收到客户端的异常引用:con.client.displaycuster=函数{。它返回时在promise TypeError:无法将属性“displaycuster”设置为undefined时出错。我这样做是否有误?这说明con.client未定义。