我有一个由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
答案 0 :(得分:1)
你看过SignalR吗?我个人会走这条路,让你的网络服务器上运行的控制台应用程序注册到与客户端相同的SignalR中心(即你的网络应用程序将托管SignalR中心)。然后使用控制台应用程序将消息推送到Web应用程序上的SignalR集线器,该应用程序将它们转发给所有侦听客户端(给定正确的设置)。
WCF路线的缺点是通常的配置噩梦,当然可能 - 但我的选择并不像SignalR那样直接。
您是否看到了以下堆栈溢出问题,以便在WCF和SignalR之间进行良好比较Push data to client using SignalR vs WCF?
上有一些很棒的教程答案 1 :(得分:0)