2014-04-16 59 views
0

我有一個WCF服務,該服務在WSHttp端點上運行得非常好,作爲ServiceHost下的Windows服務運行。但是由於可伸縮性,我想移動到TCP端點。對於我的生活,我無法弄清楚如何正確承載它。這裏是我的主機的OnStart程序,在VB:WCF,Net.Tcp端點,代碼優先

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不工作。

+0

'_svcHost.Open()'拋出?如果是這樣,什麼是例外? – ErnieL

+0

否定的,所有的行爲都應該如此,在端口8000上只是沒有監聽。根本沒有異常。 –

+0

您是否試過http://stackoverflow.com/questions/1479081/wcf-there-was-no-endpoint-listening-at-net-tcp-querier-svc-that-c​​ould-a?rq=1 –

回答

2

確定WCF服務偵聽器在啓動過程中執行的操作的最佳方法是啓用WCF跟蹤。因此,我建議您在服務上配置跟蹤,該服務應提供有關啓動時發生的任何基礎異常的詳細信息。

WCF跟蹤提供故障監視和分析的診斷數據。您可以使用跟蹤而不是調試器來了解應用程序的行爲方式或錯誤原因。您還可以關聯組件間的錯誤和處理以提供端到端的體驗,包括跨應用程序所有組件的進程里程碑跟蹤,例如操作調用,代碼異常,警告和其他重要的處理事件。

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

+0

我完全同意,但重點是沒有錯。 Windows服務啓動正常,在我告訴它聽的端口上沒有任何監聽。該服務在WsHttp中也可以很好地工作。 WCF服務在這裏不是問題,即使是「Hello World」服務也不行,因爲我無法首先添加服務引用。該服務應該在TCP端口8000上監聽,但是netstat -a告訴我沒有任何端口監聽8000.然而,Windows服務運行正常,除了啓動和停止消息之外,它的事件日誌是空的。 –

+0

我想我理解這個場景......服務啓動正常,沒有Windows錯誤,但是netstat確認WCF沒有在指定端口上偵聽。根據我的經驗,在這種情況下(並不少見),WCF跟蹤文件經常會發現問題。 – Seymour

+0

我的一些Net.TCP服務無法正常工作,直到Net.Tcp偵聽器適配器服務或該計算機上的Windows進程激活服務重新啓動時出現問題。如果您重新啓動Windows進程激活服務,它應該重新啓動兩者。 –

1

我能在這裏看到的唯一的問題是方法GetIPv4Address()和返回結果是什麼。通常,最好的選擇是使用localhost,主機名或0.0.0.0。

+0

GetIPv4Address獲取我希望服務偵聽的接口的特定IP地址。此機器上有多個網絡接口。 –