通过SignalR的WCF SSE [英] WCF SSE via SignalR
问题描述
我有几个不同的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屋!