【问题标题】:WCF, Net.Tcp endpoint, code-firstWCF,Net.Tcp 端点,代码优先
【发布时间】:2014-04-16 17:14:04
【问题描述】:

我有一个 WCF 服务,该服务在 WSHttp 端点上运行良好,在 ServiceHost 下作为 Windows 服务运行。但是,由于可扩展性,我想移动到 TCP 端点。对于我的生活,我无法弄清楚如何正确托管它。这是我的主机在 VB 中的 OnStart 例程:

Protected Overrides Sub OnStart(ByVal args() As String)
    If _svcHost IsNot Nothing Then
        _svcHost.Close()
    End If

    _svcHost = New ServiceHost(GetType(AutoTestsDataService), New Uri("net.tcp://" & GetIPv4Address() & ":8000"))

    Dim metaDataBehavior = _svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
    If metaDataBehavior Is Nothing Then
        _svcHost.Description.Behaviors.Add(New ServiceMetadataBehavior() With {.HttpGetEnabled = False})
    Else
        metaDataBehavior.HttpGetEnabled = False
    End If

    _svcHost.AddServiceEndpoint(GetType(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding, "mex")
    _svcHost.AddServiceEndpoint(GetType(AutoTestsDataService), New NetTcpBinding(SecurityMode.None, False), ServiceName)

    Dim debugBehavior As ServiceDebugBehavior = _svcHost.Description.Behaviors.Find(Of ServiceDebugBehavior)()
    If debugBehavior Is Nothing Then
        _svcHost.Description.Behaviors.Add(New ServiceDebugBehavior() With {.IncludeExceptionDetailInFaults = My.Settings.flagDebug})
    Else
        debugBehavior.IncludeExceptionDetailInFaults = My.Settings.flagDebug
    End If

    Try
        _svcHost.Open()
    Catch ex As Exception
        _svcHost.Abort()
    End Try
End Sub

按原样,代码编译正常,安装正常,Windows 服务启动正常。但是端口 8000 上没有任何监听。我已确保 Net.Tcp 监听器和端口共享服务运行正常。我选择完全不使用配置文件,因为过去我遇到了很多问题,而且对我来说将代码放在配置文件中是不好的,不管微软想让我相信什么。无论如何,代码优先的实现总是比 XML 更容易理解,对我来说,上面的代码将所有正确的部分放在正确的位置。它只是拒绝工作。就像我说的我可以坚持使用 WSHttp,但我更愿意理解为什么 Net.Tcp 不起作用。

【问题讨论】:

  • _svcHost.Open() 扔了吗?如果有,有什么例外?
  • 否定,一切正常,8000端口没有任何监听。根本没有抛出异常。
  • 该链接指向 IIS 托管服务。我的是通过 ServiceHost 托管的,据我所知,没有要启用的协议。只要 Net.Tcp Listener 服务正在运行,它就应该可以工作。

标签: web-services wcf vb.net service


【解决方案1】:

确定 WCF 服务侦听器在启动期间执行的操作的最佳方法是启用 WCF 跟踪。因此,我建议您在服务上配置跟踪,它应该提供有关启动时发生的任何底层异常的详细信息。

WCF 跟踪为故障监控和分析提供诊断数据。您可以使用跟踪而不是调试器来了解应用程序的行为方式或故障原因。您还可以跨组件关联故障和处理以提供端到端体验,包括跨应用程序所有组件的流程里程碑跟踪,例如操作调用、代码异常、警告和其他重要处理事件。

http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx

【讨论】:

  • 我完全同意,但重点是没有错。 Windows 服务正常启动,我告诉它监听的端口上没有任何监听。该服务在 WsHttp 中也可以正常工作。 WCF 服务不是这里的问题,即使是“Hello World”服务也不起作用,因为我一开始就无法添加服务引用。该服务应该正在侦听 TCP 端口 8000,但 netstat -a 告诉我没有在侦听端口 8000。但是 Windows 服务运行良好,除了启动和停止消息之外,它的事件日志是空的。
  • 我想我理解这个场景......服务启动正常,没有 Windows 错误,但 netstat 确认 WCF 没有在指定端口上侦听。根据我的经验,在这种情况下(并不少见),WCF 跟踪文件通常会揭示问题。
  • 在重新启动该计算机上的 Net.Tcp 侦听器适配器服务或 Windows 进程激活服务之前,我的一些 Net.TCP 服务无法正常工作。如果您重新启动 Windows 进程激活服务,它应该同时重新启动。
【解决方案2】:

我在这里看到的唯一问题是方法GetIPv4Address() 及其返回的内容。通常最好的选择是使用 localhost、主机名或 0.0.0.0。

【讨论】:

  • GetIPv4Address 获取我希望服务侦听的接口的特定 IP 地址。这台机器上有多个网络接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多