我有一个n层应用程序,它有一个WCF服务,公开我作为Windows服务托管的所有业务逻辑,以MVC应用程序作为客户端,使用服务。
大多数示例都显示了MVC应用程序中的SignalR。我已经尝试将Hub提取到一个单独的DLL中,如下所示:
Hub.dll
public class Chat : Hub
{
public void Send(string message)
{
Clients.All.addMessage(message);
}
}
并尝试从我的MVC cshtml调用Send(),即使在添加Hub.dll作为参考后也无效。
这是我的cshtml文件中的javascript:
<script type="text/javascript">
$(function() {
// Proxy created on the fly
var chat = $.connection.chat;
// Declare a function on the chat hub so the server can invoke it
chat.client.addMessage = function(message) {
$('#messages').append('<li>' + message + '</li>');
};
// Start the connection
$.connection.hub.start().done(function() {
$("#broadcast").click(function() {
// Call the chat method on the server
chat.server.send($('#msg').val());
});
});
});
</script>
虽然上面的代码是一个非常基本的例子,但我想要完成的示例与那些SignalR进度条教程类似,除了进度报告将由我的业务层完成。
为了进一步阐述,我想做这样的事情:
1)MVC客户端通过托管的WCF服务调用PerformLongRunningTaskA()。
2)WCF服务调用业务层
中的方法3)业务层启动PerformLongRunningTaskA()
4)业务层报告进度回MVC客户端10%.. 20%..等到100%(使用SignalR?)
这个我的项目结构大致如下: 演示文稿 - MVC应用程序 服务层 - WCF服务(托管在Windows服务上) 业务层 - 我所有的业务逻辑 数据层 - 实体框架
编辑:
以上现在有效。这是我的一些JavaScript错误。
我创建了另一个控制台应用,模拟我的业务DLL以触发信号器来广播这样的事件:
class Program
{
static void Main(string[] args)
{
Say("HEY");
}
public static void Say(string message)
{
var context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
context.Clients.All.say(message);
}
}
我已将Hub.dll添加为我的控制台项目的参考,但上面现在不起作用。没有错误消息,没有。它只是正常运行,但我的MVC应用程序不显示消息。
答案 0 :(得分:5)
如果您假装要广播消息,则需要在“服务上下文”中,我的意思是您必须能够访问托管的Hub上下文。
如果您需要从Console应用程序进行广播,您可以在Hub中创建允许您这样做的方法,并使您的控制台应用程序成为主SignalR服务器的客户端。 有关如何创建.net控制台SignalR客户端的详细信息:SignalR Client Hubs
如果您需要在控制台应用中使用“托管上下文”,请尝试使用SelfHost SignalR SelfHost
干杯,