从控制器动作mvc调用SignalR hub

时间:2018-05-17 10:56:49

标签: c# asp.net-mvc model-view-controller signalr

在我的项目中,如果收到新数据,我想更新我的数据表。我的项目包含一个MVC .Net项目,一个Web服务和一个Windows窗体应用程序。

当在winfom app中输入新数据信息时,数据发送到服务和服务更新数据库,然后在Web应用程序(mvc)中调用SignalR hub。

在我的网络应用程序中,我可以使用JavaScript模型(如微软文档中的聊天客户端)在视图文件(cshtml文件)中调用signalR。这种方法在Web应用程序中运行良好,但我不能使用从我的Web服务调用它。我也找到一些使用某些模型的演示(比如使用signalR的2个控制台应用程序),但我无法在我的解决方案中转换它。

这是我的中心(dataHub):

public class DataHub : Hub
{

    /// <summary>
    ///     update software/companies live update table. data came from signal action in HomeController.
    /// </summary>
    /// <param name="signalFor"></param>
    /// <param name="id"></param>
    /// <param name="weight"></param>
    /// <param name="name"></param>
    /// <param name="datetime"></param>
    public void UpdateSignal(string signalFor, string id, string weight, string name, string datetime)
    {
        Clients.All.readyforupdate(signalFor, id, weight, name, datetime);
    }
}

我从一个名为signal的actionResult中调用它。

    /// <summary>
    ///     update signals form other palces.
    /// </summary>
    /// <param name="signalFor">"software", "company"</param>
    /// <param name="id">signal data id</param>
    /// <param name="weight">signal data weight</param>
    /// <param name="name">signal data name</param>
    /// <param name="datetime">signal data datetime</param>
    /// <returns></returns>
    public ActionResult Signal(string signalFor, string gid, string weight, string name, string datetime)
    {

        ViewBag.signalFor = signalFor;
        ViewBag.id = gid;
        ViewBag.weight = weight;
        ViewBag.name = name;
        ViewBag.datetime = datetime;
        return View();
    }

我的问题是:如何在不使用JavaScript模型的情况下直接从Web服务(使用页面的url)调用signalR hub更新功能。

更新

感谢。这对我有用:

    public string sender()
    {
        var ran = new Random();
        var x = new LiveUpdate
        {
            Id = Guid.Parse("9FEDD9FB-FE14-4BC2-B0BD-296E71ABAC26"),
            Weight = ran.Next(20000, 35000),
            Name = "companyName",
            Datetime = DateTime.Now
        };

        var hubConnection = new HubConnection("http://localhost:5138/");
        IHubProxy myHub = hubConnection.CreateHubProxy("DataHub");
        hubConnection.Start().Wait();
        myHub.Invoke("UpdateSignal",
            "company",
            x.Id.ToString(),
            x.Weight.ToString(),
            x.Name,
            x.Datetime.ToShortTimeString()
            );
        return "send";
    }

1 个答案:

答案 0 :(得分:0)

You have to call your HUB and dispatch an event to all connected clients, please refer to this example:

var dataHub = GlobalHost.ConnectionManager.GetHubContext<DataHub>();
dataHub.Clients.All.UpdateSignal(...);