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