从 MVC 中的控制器调用 SignalR 集线器

Invoke a SignalR hub from controller in MVC

我在 visual studio 4.5 框架中使用 SignalR 作为中央集线器制作了控制台集线器应用程序。

通过这个 Hub,我们可以将通知从 Web 应用程序发送到桌面应用程序。我们可以从 jquery 调用集线器,但我的任务是从 asp.net MVC 控制器 class 连接控制台集线器。 所以这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using AGPWebClient;
using AGPWebClient.Classes;
using AGPWebMVC.Models;
using System.Threading;
using System.Globalization;
using System.Resources;
using System.Reflection;
using System.ComponentModel;
using AGPWebMVC.Controllers;
namespace ConsoleAppHubClass
{
public class MyHub : Hub
{
    public void AddMessage(string name, string message)
    {
        Console.WriteLine("Hub AddMessage {0} {1}\n", name, message);
        Clients.All.addMessage(name, message);
    }

    public void Heartbeat()
    {
        Console.WriteLine("Hub Heartbeat\n");
        Clients.All.heartbeat();
    }

    //public void SendHelloObject(HelloModel hello)
    //{
    //    Console.WriteLine("Hub hello {0} {1}\n", hello.Molly, hello.Age);
    //    Clients.All.sendHelloObject(hello);
    //}

    public override Task OnConnected()
    {
        Console.WriteLine("Hub OnConnected {0}\n", Context.ConnectionId);
        return (base.OnConnected());
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        Console.WriteLine("Hub OnDisconnected {0}\n", Context.ConnectionId);
        return (base.OnDisconnected(stopCalled));
    }

    public override Task OnReconnected()
    {
        Console.WriteLine("Hub OnReconnected {0}\n", Context.ConnectionId);
        return (base.OnDisconnected(false));
    }


    }
  }

并创建 Startup.cs class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;

namespace ConsoleAppHubClass
{
public class Startup
{
    public void Configuration(IAppBuilder app)
    {

        app.Map("/signalr/hubs", map =>
        {

            map.UseCors(CorsOptions.AllowAll);

            var hubConfiguration = new HubConfiguration
            {


            };

            hubConfiguration.EnableJavaScriptProxies= true;
            hubConfiguration.EnableJSONP = true;
            hubConfiguration.EnableDetailedErrors = true;
            map.RunSignalR(hubConfiguration);
        });
    }
}
}

然后我在 asp.net MVC 网络应用程序中创建了新项目以集成到 "myHub" 之上。 在该网络应用程序中,我想在 Controller class.

中调用 "myHub"

有什么办法吗??

当然,您只需使用 MVC 项目中的 SignalR .NET Client library,然后从您的控制器内部调用集线器的方法或多或少与使用无代理的 Javascript 客户端相同方法。类似于:

//somewhere you setup your connection once, you decide where
//variables should probably be members of some class
var hubConnection = new HubConnection("http://your_end_point:port/");
var hubProxy = hubConnection.CreateHubProxy("MyHub");
await hubConnection.Start();
...
//somewhere else in your controller you use the proxy to do your calls
hubProxy.Invoke("AddMessage", "foo", "bar");

勾选here

那么,您的设计是您案例中的最佳解决方案吗?不确定,没有足够的信息来决定它。此外,您的 MVC 应用程序将像连接到您的控制台应用程序的任何其他 JS 页面一样被视为客户端,因此您可能需要区分它们,但同样,不确定您要实现的目标。