【问题标题】:WCF SSE via SignalR通过 SignalR 的 WCF SSE
【发布时间】:2015-03-25 13:14:50
【问题描述】:

我有几个不同的 WCF 服务正在运行。我想向将运行 IE 11 的客户端发送单向消息。我想以类 (ServiceName,Message,MessageDT) 的形式发送消息,然后任何监听特定服务的客户端都会收到消息,并将其显示给用户。我看过一些关于 SignalR 的教程,它们似乎都是略有不同的场景,比如聊天应用程序。即使是 Stock Ticker 示例,也有这个随机类在计时器上工作以更新股票价格。它令人困惑。有没有人有关于如何做我想做的事情的好示例教程?

【问题讨论】:

    标签: wcf c#-4.0 signalr


    【解决方案1】:

    我终于弄明白了,所以我想我会把答案发布给有需要的人。

    首先我用我的消息类创建了一个类库(WMAppLib):

    Public Class VirtualConsoleMessage
        Private m_AppName As String
        Public Property AppName() As String
            Get
                Return m_AppName
            End Get
            Set(value As String)
                m_AppName = value
            End Set
        End Property
        Private m_MessageDT As DateTime
        Public Property MessageDT() As DateTime
            Get
                Return m_MessageDT
            End Get
            Set(value As DateTime)
                m_MessageDT = value
            End Set
        End Property
        Private m_Message As String
        Public Property Message() As String
            Get
                Return m_Message
            End Get
            Set(value As String)
                m_Message = value
            End Set
        End Property
    End Class
    

    然后在我的 Web 应用程序中,我添加了 SignalR 引用,以及对我的类库的引用。然后我创建了一个 Hub:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Microsoft.AspNet.SignalR;
    using Microsoft.AspNet.SignalR.Hubs;
    using System.Threading.Tasks;
    using WMAppLib;
    
    namespace WMApp_WebAdmin
    {
        [HubName("VirtualConsoleMessageHub")]
        public class Virtual_ConsoleHub : Hub
        {
            public void AddSubscription(string AppName)
            {
                Groups.Add(Context.ConnectionId,AppName);
            }
            public void BroadcastMessage(VirtualConsoleMessage vcm)
            {
                string strClientMessage = vcm.MessageDT.ToString("MM/dd/yyyy hh:mm:ss tt") + " : " + vcm.Message;
                Clients.Group(vcm.AppName).newMessageReceived(strClientMessage);
            }
        }
    }
    

    我的网页 (VirtualConsole) 有以下标记:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="VirtualConsole.aspx.cs" Inherits="WMApp_WebAdmin.VirtualConsole" %>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Virtual Console</title>
        <link href="/CSS/styleVC.css" type="text/css" rel="stylesheet" />
        <script src="/JS/jquery-1.11.1.min.js" type="text/javascript"></script>
        <script src="/Scripts/jquery.signalR-2.2.0.min.js" type="text/javascript"></script>
        <script src="signalr/hubs"></script>
        <script src="/JS/VirtualConsole.js" type="text/javascript""></script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div id="divConsole" runat="server">
            </div>
            <asp:HiddenField ID="AppName" runat="server" />
            <asp:HiddenField ID="Endpoint" runat="server" />
            <asp:HiddenField ID="AssemblyName" runat="server" />
            <asp:HiddenField ID="ClassName" runat="server" />
        </form>
    </body>
    </html>
    

    我的 VirtualConsole.js 有以下内容:

    $(function () {
        var myVirtualConsoleHub = $.connection.VirtualConsoleMessageHub;
        myVirtualConsoleHub.client.newMessageReceived = function (message) {
            $("#divConsole").append("<p>" + message + "</p>");
        }
        $.connection.hub.url = "/signalr";
        $.connection.hub.start().done(function () {
            myVirtualConsoleHub.server.addSubscription($("#AppName").val());
        }).fail(function (error) {
            $("#divConsole").append("<p>" + error + "</p>");
        });;
    });
    $().ready(function () {
        var endpoint = $("#Endpoint").val();
    });
    

    在我的 WCF 服务中,我添加了 SignalR 和 SignalR.Client。我还添加了对我的 WMAppLib 类库的引用。在我的主代码中,我添加了两个全局变量:

    Dim virtualConsoleHubConnection As HubConnection
    Dim virtualConsoleHubProxy As IHubProxy
    

    在 My Public Sub New() 中,我将这些设置为 App.config 中的值:

    virtualConsoleHubConnection = New HubConnection(ConfigurationManager.AppSettings("virtualConsoleHubURL"))
    virtualConsoleHubProxy = virtualConsoleHubConnection.CreateHubProxy(ConfigurationManager.AppSettings("virtualConsoleHubName"))
    

    这些在 App.Config 中设置为:

    <add key="virtualConsoleHubURL" value="http://localhost:49716/signalr/hubs"/>
    <add key="virtualConsoleHubName" value="VirtualConsoleMessageHub"/>
    

    然后我添加了一个 Private Sub 来处理将所有消息广播到 SignalR 集线器:

    Private Sub WriteToVirtualConsole(ByVal vcm As VirtualConsoleMessage)
        Try
            virtualConsoleHubConnection.Start()
            virtualConsoleHubProxy.Invoke("BroadcastMessage", vcm)
        Catch ex As Exception
        Finally
            If virtualConsoleHubConnection.State = Microsoft.AspNet.SignalR.Client.ConnectionState.Connected Then
                virtualConsoleHubConnection.Stop()
            End If
        End Try
    End Sub
    

    然后,每当我执行 Console.WriteLine 时,我都会调用它:

    WriteToVirtualConsole(New VirtualConsoleMessage With {.AppName = "MyWCFService", .MessageDT = Now, .Message = "I just did something"})
    

    然后它会显示在我的网页虚拟控制台页面上。

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2014-08-02
      • 2020-05-14
      • 2019-02-24
      相关资源
      最近更新 更多