C# N层WCF应用程序中的信号器

C# N层WCF应用程序中的信号器,c#,asp.net-mvc,wcf,signalr,n-tier-architecture,C#,Asp.net Mvc,Wcf,Signalr,N Tier Architecture,我有一个n层应用程序,它有一个WCF服务,公开我的所有业务逻辑,作为windows服务托管,以MVC应用程序作为客户端,使用这些服务 大多数示例都显示了MVC应用程序中的信号器。我已尝试将集线器解压缩到单独的DLL中,如下所示: class Program { static void Main(string[] args) { Say("HEY"); } public static void Say(string message) {

我有一个n层应用程序,它有一个WCF服务,公开我的所有业务逻辑,作为windows服务托管,以MVC应用程序作为客户端,使用这些服务

大多数示例都显示了MVC应用程序中的信号器。我已尝试将集线器解压缩到单独的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

public class Chat : Hub
{

    public void Send(string message)
    {
        Clients.All.addMessage(message);
    }
}
即使在添加Hub.dll作为引用之后,尝试从我的MVC cshtml调用Send()也不起作用

这是我的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>

$(函数(){
//动态创建的代理
var chat=$.connection.chat;
//在聊天中心上声明一个函数,以便服务器可以调用它
chat.client.addMessage=函数(消息){
$(“#消息”).append(“
  • ”+消息+”
  • ”); }; //启动连接 $.connection.hub.start().done(函数()){ $(“#广播”)。单击(函数(){ //在服务器上调用chat方法 chat.server.send($('#msg').val()); }); }); });
    虽然上面的代码是一个非常基本的示例,但我希望实现的示例与那些signar进度条教程类似,只是进度报告将由我的业务层完成

    为了进一步说明,我想这样做:

    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);
        }
    }
    
    1) MVC客户端通过托管的WCF服务调用PerformLongRunningTaskA()

    2) WCF服务调用业务层中的方法

    3) 业务层开始PerformLongRunningTaskA()

    4) 业务层将进度报告给MVC客户端10%…20%…等,直到100%(使用信号器?)

    我的项目结构大致如下: 演示文稿-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);
        }
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    说(“嘿”);
    }
    公共静态void Say(字符串消息)
    {
    var context=GlobalHost.ConnectionManager.GetHubContext();
    context.Clients.All.say(消息);
    }
    }
    

    我已经添加了Hub.dll作为对控制台项目的引用,但是上面的方法现在不起作用。没有错误消息,什么也没有。它只是正常运行,但我的MVC应用程序不显示消息。

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

    如果您需要从控制台应用程序进行广播,您可以在Hub中创建允许您进行广播的方法,并使您的控制台应用程序成为主SignalR服务器的客户端。 有关如何创建.net控制台信号器客户端的详细信息:

    如果您需要在控制台应用程序中使用“托管上下文”,请尝试SelfHost


    干杯,

    你能更详细地解释一下它是如何“不起作用”的吗?调用$.connection.hub.start()或chat.server.send($('#msg').val())是否失败?是否有来自客户端的任何请求接收到非200响应状态?您不能只添加对包含集线器的dll的引用,然后期望它工作。SignalR客户端连接到运行SignalR的服务器。无法从该服务器外部广播。信号器客户端集线器上提供的链接不再工作。以下是最新版本: