2012-11-29 40 views
2

我有一个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应用程序不显示消息。

+0

你能解释它是如何“不工作”的更详细的?调用$ .connection.hub.start()或chat.server.send($('#msg')。val())会失败吗?来自客户端的任何请求是否收到非200响应状态? – halter73

+0

你不能只添加一个引用到其中有集线器的dll,并期望它可以工作。 SignalR客户端连接到运行SignalR的服务器。您无法从该服务器之外进行广播。 – davidfowl

回答

5

如果你假装广播消息,你需要在“服务上下文”中,我的意思是你必须有权访问托管的Hub上下文。

如果您需要通过控制台应用程序进行广播,您可以在Hub中创建允许您这样做的方法,并使您的控制台应用程序成为主SignalR服务器的客户端。 详细了解如何创建一个。净控制台SignalR客户端:SignalR Client Hubs

如果您需要在控制台应用程序中的“托管语境”,然后尝试SelfHost SignalR SelfHost

干杯,

+0

SignalR客户端集线器上提供的链接不再有效。这是更新的:http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-net-client –