我有一个 n 层应用程序,它有一个 WCF 服务公开我的所有业务逻辑,作为 Windows 服务托管,MVC 应用程序作为客户端,使用这些服务。
大多数示例都显示了 MVC 应用程序中的 SignalR。我尝试将集线器提取到一个单独的 DLL 中,如下所示:
集线器.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%..etc 直到 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 应用程序不显示该消息。