【发布时间】:2015-05-15 05:09:00
【问题描述】:
我有一个由 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),它只是向客户端回显消息。我想要一种服务器到客户端消息传递的方式。有人可以帮忙吗?这是我最新的代码尝试:
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
【问题讨论】:
-
添加了 C# 作为标签。希望得到更多关注。我可以轻松地将 c# 转换为 vb。请帮忙! :)
-
每个请求只有一个响应?或者每个请求可能有很多 Console.Writeline?
-
我真的不希望有来自客户端的请求,除了初始的 RegisterClient。然后我希望服务器将每个单独的“Console.WriteLine”推送到客户端。如果我必须使用长轮询,那么我想我可以让客户端异步调用 GetMessage 方法,然后无论何时返回消息,它都会转到客户端处理程序,然后我可以进行另一个 GetMessage 调用。然而,首选的方法就像股票行情,客户端什么都不请求,只是提供新的 Console.WriteLines,因为它们是由服务器生成的。
-
如果您正在使用 .NET 和 JavaScript 进行 websockets,那么您可能希望使用 SignalR。
-
this link 显示了从服务器发送多个回调redirect the stdout 然后发送响应的方式。我不建议您使用 SignalR,因为我的公司在我们决定将其删除之前,在这项技术方面存在很多问题(异常、断开连接等......)。 this stream service 看起来很有趣
标签: javascript c# vb.net wcf