.net - 使用 WinForms 和 Framework 4.8 MVC 的 Signalr

标签 .net asp.net-mvc winforms signalr

我正在尝试使用信号器作为通知者创建一个作业通知进程。我的情况是,我有一个 winforms 项目,它将控制流程的各个阶段。 MVC 项目中流程影响的系统。

就目前情况而言,我有这些项目: 流程(Winform) 系统(框架4.8 MVC) 服务(框架4.8) SignalRSelfHost(控制台)

服务层由流程和系统项目引用,并包含流程每个步骤的逻辑。当一个阶段开始或结束时,它需要调用连接的客户端并让他们知道..

我最初在系统项目中创建了信号器内容,并且能够从页面上的按钮调用服务方法,并按预期传递开始/结束消息。然后我创建了 winforms 应用程序并调用了相同的服务方法。当我这样做时,没有消息发送到网络客户端。

值得一提的是,winforms 项目对 signalr 一无所知,它被留给服务使用以下方式与 signalr 进行协商:

            var context = GlobalHost.ConnectionManager.GetHubContext<ProcessHub>();
            context.Clients.All.StageStarted(stage.started);

然后我突然意识到,即使服务的两条路由运行相同的代码,但它们创建的集线器可能是独立的,永远不会作为一个整体进行通信。

然后我想也许我需要一个独立于系统和进程端的通用信号服务器,两者都可以使用。我创建了一个笔记控制台应用程序,它将充当自主机,然后运行为:

http://localhost:8080

然后我可以重新指向我的脚本标记以查找该 URL,而不是 Web 端的 ../signalr。

我现在的问题是如何让 WinForms 和 Web 应用程序将正确的上下文注入(inject)到服务中?

我尝试为我的服务创建一个构造函数,如下所示:

    private IHubContext<ProcessHub> Clients {get;set;}

    public ProcessService(IHubContext<ProcessHub> clients)
    {
        Clients = clients;
    }

但是我没有使用 core,所以我无法弄清楚如何从我的 Controller 创建该服务的实例(我通常会在 .net core 中使用 DI 并注册我的服务)我尝试了这个,但它显然是错误的。 ..

    public ProcessController(IHubContext<ProcessHub> clients)
    {
        _processService = new ProcessService(clients);
    }

这告诉我 Controller 需要一个无参数构造函数。如果我创建其中之一,我想我将无法按预期使用该服务。我没有尝试将 win 表单连接到该服务,因为我认为我会遇到类似的问题。

任何人都可以帮助我 a) 我是不是完全找错了树...b) 我如何创建我的服务实例并让它了解我的中心上下文。

非常感谢!

最佳答案

让我向您展示我的解决方案,它正在与我一起工作,我正在使用 asp.NET MVC .net4.6 和winforms.net4.8

  1. 通知中心:
    [HubName("notifyHub")]
    public class NotifyHub : Hub
    {
        public void Send(string name, string message)
        {
            Clients.All.broadcastMessage(name, message);
        }

        public Task JoinGroup(string groupName)
        {
            return Groups.Add(Context.ConnectionId, groupName);

        }

        public Task LeaveGroup(string groupName)
        {
            return Groups.Remove(Context.ConnectionId, groupName);
        }
    }
  • MVC-Controller-Action 向客户端发送消息:
  • public ActionResult CreateCustomer(Customer customer)
    {
        if (ModelState.IsValid)
        {
            db.Customers.Add(customer);
            db.SaveChanges();
            var notificationHub = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<NotifyHub>();
            notificationHub.Clients.Group(YourCustomGroupOfClients.ToString()).UpdateCustomer(customer);
            return RedirectToAction("Index");
        }
    
        return View(customer);
    }
    
  • 客户端(winforms):
  • //  Create this hub globally just one time
    public static HubConnection hubConnection = new HubConnection(baseUrl);
    
    readonly IHubProxy stockTickerHubProxy = Globals.hubConnection.CreateHubProxy("notifyHub");
    
    stockTickerHubProxy.On<Customer>("UpdateCustomer", async customer =>
    {
        try
        {
            var oldCust = await db.Customers.FirstOrDefaultAsync(a => a.id == customer.id);
            if (oldCust == null)
            {
                db.Customer.Add(customer);
            }
            else
            {
                oldCust.Cust_Name = customer.Cust_Name;
                oldCust.Phone1 = customer.Phone1;
            }
            await db.SaveChangesAsync();
            if (InvokeRequired) Invoke(new MethodInvoker(delegate
            {
                Refresh_DG_Customers();
            }));
        }
        catch (Exception)
        {
        }
    });
    

    关于.net - 使用 WinForms 和 Framework 4.8 MVC 的 Signalr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69119497/

    相关文章:

    asp.net-mvc - 在 HtmlHelper 扩展方法中构建 html 字符串

    c# - 从括号表示法中的查询字符串绑定(bind)模型

    c# - 将 docx 文件合并在一起,包括页眉、页脚和图片

    c# - 标签上的透明标签

    c# - 绘制可滚动 datagridview 时出现问题

    c# - 如何在 c# 程序中连续运行函数

    c# - 检测互联网连接是否繁忙

    c# - 如何将这些 LINQ 结果加载到我的 ViewModel 类中?

    c# - EF 选择性能 - Task.FromResult 与 ToListAsync

    c# - MVC : model of type Nullable<T>