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

时间:2015-03-12 12:27:30

标签: c# asp.net-mvc-4 signalr

我使用SignalR为Visual Studio 4.5框架中的中心设备制作了控制台中心应用程序。

通过此Hub,我们可以将Web应用程序的通知发送到桌面应用程序。我们可以从jquery调用hub,但我的任务是从asp.net MVC Contoller类连接控制台中心。 所以这是我的代码

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类

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"。 在那个网络应用程序中,我想调用" myHub"在Controller类中。

有什么办法吗?

1 个答案:

答案 0 :(得分:4)

当然,您只需使用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页面一样被视为客户端,因此您可能需要区分它们,但同样,不确定您要实现的目标。