【问题标题】:Virtual Console for Web App Using Websockets使用 Websockets 的 Web 应用程序虚拟控制台
【发布时间】: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


【解决方案1】:

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

WCF 路由的缺点是通常的配置噩梦,当然有可能 - 但在我看来不像 SignalR 那样直接。

你有没有看过下面的堆栈溢出问题,以便很好地比较 WCF 和 SignalR Push data to client using SignalR vs WCF?

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

【讨论】:

  • 我宁愿不必依赖在后台运行的第 3 方应用程序。目前我正在考虑做 SSE(正如 DanDavis 所建议的)在这种情况下我真的不需要双工通信,因为服务器正在做所有的推送。
  • @DavidP SignalR 是 Microsoft 的核心 asp.net 技术的一部分,它实际上并不是 .net 框架本身的第 3 方 :-)。通过一行配置,您可以让 SignalR 执行 SSE 而不是 websockets。
  • 好的 - 如果你想要 100 分,请向我展示如何让 WCF 服务方法使用 SSE 通过 SignalR 向 javascript 客户端发送消息的示例
【解决方案2】:

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

请查看我的回答:WCF SSE via SignalR

感谢所有建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多