使用 Websocket 的 Web 应用程序的虚拟控制台

Virtual Console for Web App Using Websockets

本文关键字:虚拟控制台 应用程序 Web 使用 Websocket      更新时间:2023-09-26

我有一个由Windows服务承载的WCF服务。当存在命令参数时,它也可以作为控制台程序运行。它有一个接口使用 MSMQIntegrationBinding,另一个接口绑定到 HTTP 以获取服务实用程序方法。这很好用。 我有一个 Web 应用程序(为 IE 11 编写),允许用户监视服务并执行实用程序方法。代码中有许多 Console.WriteLines 显然不会显示代码是否作为服务运行。

我的老板现在要求他能够在控制台中查看正在运行的服务,就像它作为控制台应用程序运行一样。我想向我的 Web 应用程序添加新的虚拟控制台窗口,该窗口只会在服务器上出现新的 Console.WriteLines 时显示它们。我想我可以在我的 wcf 服务中编写一个函数,该函数将接受消息作为字符串,执行 Console.WriteLine,然后将消息推送到任何侦听客户端,例如我的 Web 应用程序控制台窗口。我正在考虑在客户端上使用javascript。

我已经阅读了有关将Websockets与netHttpBinding用于WCF服务的信息,这就是我想采用的方法。 但是,我看到的示例似乎是双向的,例如聊天窗口 (http://www.codeproject.com/Articles/619343/Using-WebSocket-in-NET-4-5-Part-3),它只是向客户端回显消息。 我想要单向服务器到客户端消息传递。有人可以帮忙吗?这是我最新的代码尝试:

伊姆洛格.VB

<ServiceContract(CallbackContract:=GetType(IWMLogger_MessageCallback))>
Public Interface IWMLogger_ClientListener
    <OperationContract(IsOneWay:=True)>
    Function ListenForServerMessages() As Task
End Interface
<ServiceContract>
Interface IWMLogger_MessageCallback
    <OperationContract(IsOneWay:=True)>
    Function SendMessageToClient(ByVal msg As String) As Task
End Interface

威姆洛格.VB

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single)> _
Public Class WMLogger_Service
Implements IWMLogger_Service, IWMLogger_Service_MSMQ, IWMLogger_ClientListener
    Public Async Function ListenForServerMessages() As Task Implements IWMLogger_ClientListener.ListenForServerMessages
        Dim callback = OperationContext.Current.GetCallbackChannel(Of IWMLogger_MessageCallback)()
        If DirectCast(callback, IChannel).State = CommunicationState.Opened Then
            'Not sure what to do here
            'Await callback.SendMessageToClient(
        End If
    End Function
End Class

你研究过SignalR吗?就我个人而言,我会走这条路,让在 Web 服务器上运行的控制台应用注册到与客户端相同的 SignalR 中心(即你的 Web 应用将托管 SignalR 中心)。然后使用控制台应用将消息推送到 Web 应用上的 SignalR 中心,这会将它们中继到所有侦听客户端(给定正确的设置)。

WCF 路由的缺点是通常的配置噩梦,当然是可能的 - 但在我的选择中,不像 SignalR 那么简单。

您是否看到以下堆栈溢出问题,以便很好地比较使用 SignalR 与 WCF 将数据推送到客户端的 WCF 和 SignalR 数据?

有一些很棒的教程 http://www.asp.net/signalr

我最终选择了最终有效的 SignalR 解决方案。我认为这可能有点矫枉过正,但我很高兴它有效。

请参阅我的答案:WCF SSE via SignalR

感谢您的所有建议。