使用 Websockets 的 Web 应用程序虚拟控制台
Virtual Console for Web App Using Websockets
我有一个由 Windows 服务托管的 WCF 服务。当存在命令参数时,它也可以 运行 作为控制台程序。它有一个接口使用 MSMQIntegrationBinding,另一个接口绑定到 HTTP 以获取服务实用程序方法。这很好用。我有一个 Web 应用程序(为 IE 11 编写),它允许用户监视服务并执行实用程序方法。代码中有很多Console.WriteLines如果代码是运行ning as a service 显然不会显示。
我的老板现在要求他能够在控制台中查看正在运行的服务,就像 运行宁作为控制台应用程序一样。我想向我的 Web 应用程序添加一个新的虚拟控制台 window,它只会显示服务器上出现的新 Console.WriteLines。我在想我可以在我的 wcf 服务中编写一个函数,它将消息作为字符串接受,执行 Console.WriteLine,然后将消息推送到任何监听客户端,例如我的 Web 应用程序控制台 window。我正在考虑在客户端上使用 javascript。
我读过有关将 Websockets 与 netHttpBinding 用于 WCF 服务的信息,这就是我想要采用的方法。但是,我看到的示例似乎是双向的,例如聊天 windows (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
您是否研究过 SignalR?就我个人而言,我会走这条路,让您的 Web 服务器上的控制台应用程序 运行 注册到与客户端相同的 SignalR hub(即您的 Web 应用程序将托管 SignalR hub)。然后使用控制台应用程序将消息推送到您的 Web 应用程序上的 SignalR 中心,这会将它们中继到所有侦听客户端(如果设置正确)。
WCF 路由的缺点是通常的配置噩梦,这当然是可能的 - 但在我看来不如 SignalR 直接。
为了更好地比较 WCF 和 SignalR,您是否看过以下堆栈溢出问题 Push data to client using SignalR vs WCF?
上有一些很棒的教程
我最终选择了一个终于奏效的 SignalR 解决方案。我认为这可能有点矫枉过正,但我很高兴它有效。
请查看我的回答:
感谢所有建议。
我有一个由 Windows 服务托管的 WCF 服务。当存在命令参数时,它也可以 运行 作为控制台程序。它有一个接口使用 MSMQIntegrationBinding,另一个接口绑定到 HTTP 以获取服务实用程序方法。这很好用。我有一个 Web 应用程序(为 IE 11 编写),它允许用户监视服务并执行实用程序方法。代码中有很多Console.WriteLines如果代码是运行ning as a service 显然不会显示。
我的老板现在要求他能够在控制台中查看正在运行的服务,就像 运行宁作为控制台应用程序一样。我想向我的 Web 应用程序添加一个新的虚拟控制台 window,它只会显示服务器上出现的新 Console.WriteLines。我在想我可以在我的 wcf 服务中编写一个函数,它将消息作为字符串接受,执行 Console.WriteLine,然后将消息推送到任何监听客户端,例如我的 Web 应用程序控制台 window。我正在考虑在客户端上使用 javascript。
我读过有关将 Websockets 与 netHttpBinding 用于 WCF 服务的信息,这就是我想要采用的方法。但是,我看到的示例似乎是双向的,例如聊天 windows (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
您是否研究过 SignalR?就我个人而言,我会走这条路,让您的 Web 服务器上的控制台应用程序 运行 注册到与客户端相同的 SignalR hub(即您的 Web 应用程序将托管 SignalR hub)。然后使用控制台应用程序将消息推送到您的 Web 应用程序上的 SignalR 中心,这会将它们中继到所有侦听客户端(如果设置正确)。
WCF 路由的缺点是通常的配置噩梦,这当然是可能的 - 但在我看来不如 SignalR 直接。
为了更好地比较 WCF 和 SignalR,您是否看过以下堆栈溢出问题 Push data to client using SignalR vs WCF?
上有一些很棒的教程我最终选择了一个终于奏效的 SignalR 解决方案。我认为这可能有点矫枉过正,但我很高兴它有效。
请查看我的回答:
感谢所有建议。