从控制器操作 mvc 调用 SignalR 中心



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

当在 WINFOM 应用中输入新的数据信息时,数据发送到服务,服务更新数据库,然后在 Web 应用中调用 SignalR 中心(MVC(。

在我的 Web 应用程序中,我可以使用 JavaScript 模型(如 Microsoft 文档中的聊天客户端(在视图文件(CSHTML 文件(中调用 SignalR。 此方法在 Web 应用程序中运行良好,但我无法使用从我的 Web 服务调用它。 我还找到了一些使用某些模型的演示(例如使用 SignalR 的 2 个控制台应用程序(,但我无法在我的解决方案中转换它。

这是我的中心(数据中心(:

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 的动作结果调用它。

/// <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 集线器更新函数。

更新


谢谢。这对我有用:

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";
}

您必须调用 HUB 并向所有连接的客户端调度事件,请参考以下示例:

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

最新更新