使用Websockets的Web App虚拟控制台

时间:2015-03-12 20:55:53

标签: javascript c# vb.net wcf

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

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

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

IWMLogger.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

WMLogger.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

2 个答案:

答案 0 :(得分:1)

你看过SignalR吗?我个人会走这条路,让你的网络服务器上运行的控制台应用程序注册到与客户端相同的SignalR中心(即你的网络应用程序将托管SignalR中心)。然后使用控制台应用程序将消息推送到Web应用程序上的SignalR集线器,该应用程序将它们转发给所有侦听客户端(给定正确的设置)。

WCF路线的缺点是通常的配置噩梦,当然可能 - 但我的选择并不像SignalR那样直接。

您是否看到了以下堆栈溢出问题,以便在WCF和SignalR之间进行良好比较Push data to client using SignalR vs WCF?

http://www.asp.net/signalr

上有一些很棒的教程

答案 1 :(得分:0)

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

请在WCF SSE via SignalR

上查看我的回答

感谢所有建议。