通过SignalR的WCF SSE [英] WCF SSE via SignalR

查看:550
本文介绍了通过SignalR的WCF SSE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个不同的WCF服务运行。我想向将运行IE 11的客户端发送单向消息。我想以类(ServiceName,Message,MessageDT)的形式发送消息,然后侦听特定服务的任何客户端都将收到消息,并将其显示给用户。我已经看过一些关于SignalR的教程,他们似乎都是略有不同的场景,如聊天应用程序。即使是股票代码示例,也有一个随机类,用于更新股票价格的计时器。它混乱。有没有人有一个很好的示例教程如何做我想做的?

解决方案

最后我能够想出这



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

 公共类VirtualConsoleMessage 
私有m_AppName As String
公共属性AppName()As String
获取
返回m_AppName
结束Get
设置(值为字符串)
m_AppName =值
结束集
结束属性
私有m_MessageDT作为DateTime
公共Property MessageDT()As DateTime
Get
返回m_MessageDT
结束Get
设置(值为DateTime)
m_MessageDT = value
结束设置
结束属性
私有m_Message As String
公共属性Message()As String
获取
返回m_Message
结束Get
设置(值为字符串)
m_Message = value
结束集
结束属性
结束类

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

 使用System; 
using System.Collections.Generic;
using System.Linq;
使用System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Threading.Tasks;
使用WMAppLib;

namespace WMApp_WebAdmin
{
[HubName(VirtualConsoleMessageHub)]
public class Virtual_ConsoleHub:Hub
{
public void AddSubscription 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);
}
}
}

我的网页有以下标记:

 <%@ Page Language =C#AutoEventWireup =trueCodeBehind =VirtualConsole.aspx .csInherits =WMApp_WebAdmin.VirtualConsole%> 

< html xmlns =http://www.w3.org/1999/xhtml>
< head id =Head1runat =server>
< title>虚拟控制台< / title>
< link href =/ CSS / styleVC.csstype =text / css =stylesheet/>
< script src =/ JS / jquery-1.11.1.min.jstype =text / javascript>< / script>
< script src =/ Scripts / jquery.signalR-2.2.0.min.jstype =text / javascript>< / script&
< script src =signalr / hubs>< / script>
< script src =/ JS / VirtualConsole.jstype =text / javascript>< / script>
< / head>
< body>
< form id =form1runat =server>
< div id =divConsolerunat =server>
< / div>
< asp:HiddenField ID =AppNamerunat =server/>
< asp:HiddenField ID =Endpointrunat =server/>
< asp:HiddenField ID =AssemblyNamerunat =server/>
< asp:HiddenField ID =ClassNamerunat =server/>
< / form>
& body>
< / html>

My VirtualConsole.js具有以下功能: p>

  $(function(){
var myVirtualConsoleHub = $ .connection.VirtualConsoleMessageHub;
myVirtualConsoleHub.client.newMessageReceived = function(message){
$(#divConsole)。append(< p>+ message +< / p>);
}
$。 .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



在我的公共子New()我设置这些值在我的App.config:

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

这些在App.Config中设置为:

 < add key =virtualConsoleHubURLvalue =http:// localhost:49716 / signalr / hubs/> 
< add key =virtualConsoleHubNamevalue =VirtualConsoleMessageHub/>然后我添加了一个Private Sub来处理向SignalR集线器的所有消息的广播:

  Private Sub WriteToVirtualConsole(ByVal vcm As VirtualConsoleMessage)
尝试
virtualConsoleHubConnection.Start()
virtualConsoleHubProxy。 Invoke(BroadcastMessage,vcm)
Catch ex As Exception
最后
如果virtualConsoleHubConnection.State = Microsoft.AspNet.SignalR.Client.ConnectionState.Connected然后
virtualConsoleHubConnection.Stop )
结束如果
结束尝试
结束子

我做一个Console.WriteLine我只是调用这个sub:

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

WebPage虚拟控制台页面。


I have a few different WCF Services running. I would like to send one-way messages to clients who will be running IE 11. I would like to send the messages in the form of a class (ServiceName,Message,MessageDT), and then any clients listening to a particular Service would receive the message, and display it to user. I have viewed a few tutorials on SignalR and they all seem to be slightly different scenarios, like a chat application. Even the Stock Ticker example, has this random class that works on a timer to update stock prices. Its confusing. Does anybody have a good sample tutorial on how to do what I want to do?

解决方案

Finally I was able to figure this out, and so I thought I would post the answer for those who are need.

First I created a class library (WMAppLib) with my message class:

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

Then in my Web Application, I added SignalR references, and also a reference to my class library. I then created a 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);
        }
    }
}

My web page (VirtualConsole) has the following markup:

<%@ 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>

My VirtualConsole.js has the following:

$(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();
});

In my WCF Service I added the SignalR, and the SignalR.Client. I also added a reference to my WMAppLib class library. In my main code I added two global variables:

Dim virtualConsoleHubConnection As HubConnection
Dim virtualConsoleHubProxy As IHubProxy

In My Public Sub New() I set these to values in my App.config:

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

These are set in the App.Config as:

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

Then I added one Private Sub to handle the broadcasting of all messages to the SignalR hub:

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

Then anytime I do a Console.WriteLine I just call this sub:

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

It then gets displayed on my WebPage Virtual Console page.

这篇关于通过SignalR的WCF SSE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆