我正在尝试使用SignalR从控制台应用程序向MVC应用程序发送消息, 以下是代码:
static void Main(string[] args)
{
string url = "http://localhost:8080";
string line=null;
MyHub obj = new MyHub();
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
Console.WriteLine("Enter your message:");
line = Console.ReadLine();
obj.Send(line);
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class MyHub : Hub
{
public void Send(string message)
{
Clients.All.addMessage(message);
}
}
以下是iam试图在网站上收到消息的方式:
<script type="text/javascript">
$(function () {
//Set the hubs URL for the connection
$.connection.hub.url = "http://localhost:8080/signalr";
// Declare a proxy to reference the hub.
var chat = $.connection.myHub;
// Create a function that the hub can call to broadcast messages.
chat.client.addMessage = function (message) {
// Html encode display name and message.
//var encodedName = $('<div />').text(name).html();
var encodedMsg = $('<div />').text(message).html();
// Add the message to the page.
$('#discussion').append('<li><strong>'
+ '</strong>: ' + encodedMsg + '</li>');
};
// Get the user name and store it to prepend to messages.
//$('#displayname').val(prompt('Enter your name:', ''));
// Set initial focus to message input box.
//$('#message').focus();
// Start the connection.
});
</script>
事情是我得到以下例外:
感觉就像我无法直接实例化Myhub类的对象,关于如何解决这个问题的任何想法,请记住我需要将消息从控制台发送到网页..任何建议???
答案 0 :(得分:1)
使用SignalR,您不会实例化集线器类,SignalR会这样做,并且它不会两次使用相同的集线器实例。切勿将状态数据存储在集线器类本身中。
SignalR使用集线器上下文来跟踪客户端并允许您与客户端进行交互。您需要先从SignalR库获取此上下文,然后才能发送信息等。IHubContext
为您提供在集线器中使用的Clients
和Groups
成员,允许您执行此操作你将在集线器中做同样的事情。
试试这个:
static void Main(string[] args)
{
string url = "http://localhost:8080";
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
// get text to send
Console.WriteLine("Enter your message:");
string line = Console.ReadLine();
// Get hub context
IHubContext ctx = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
// call addMessage on all clients of context
ctx.Clients.All.addMessage(line);
// pause to allow clients to receive
Console.ReadLine();
}
}