我有一个n层应用程序,它有一个WCF服务,公开所有我的业务逻辑,托管为一个Windows服务,作为客户端使用MVC应用程序,并使用这些服务。N层WCF应用程序中的SignalR
这里的大多数例子都显示了MVC应用程序中的SignalR。我曾尝试提取集线器到一个单独的DLL是这样的:
Hub.dll
public class Chat : Hub
{
public void Send(string message)
{
Clients.All.addMessage(message);
}
}
,并试图调用从我的MVC CSHTML发送(),甚至加入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服务) 业务层 - 我所有的业务逻辑 数据层 - Entityframew ORK
编辑:
以上现在的作品。这是我的一些JavaScript错误。
我已经创造了另一个控制台应用程序,以模拟我的生意DLL触发关闭signalr广播这样的事件:
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应用程序不显示消息。
你能解释它是如何“不工作”的更详细的?调用$ .connection.hub.start()或chat.server.send($('#msg')。val())会失败吗?来自客户端的任何请求是否收到非200响应状态? – halter73
你不能只添加一个引用到其中有集线器的dll,并期望它可以工作。 SignalR客户端连接到运行SignalR的服务器。您无法从该服务器之外进行广播。 – davidfowl