Что делает WCF ServiceHost аварийным? - PullRequest
1 голос
/ 12 июля 2010

У меня есть служба Windows, которая предоставляет один и тот же интерфейс на 4 порта с помощью WCF.Адреса:

net.tcp://localhost:1200/IContract
net.tcp://localhost:1201/IContract
net.tcp://localhost:1202/IContract
net.tcp://localhost:1203/IContract

Эта служба работает в течение длительного времени, и иногда она выходит из строя, и я даже не могу подключиться к порту с проблемой.Мне обычно приходится переустанавливать службу.

Я действительно не вижу смысла в наличии большого количества портов для одного и того же контракта, но это решение, вероятно, маскирует исходную проблему.

В любом случае, чтоможет быть, что сервисный хост аварийно завершает работу на стороне сервера?Может ли клиент аварийно завершить работу сервис-хоста, или это может быть связано с каким-либо отказом в обслуживании?

PS: эта проблема возникает эспорадически, и я не могу воспроизвести в dev.Использование трассировки в производстве также нецелесообразно.

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Вы можете спросить Доктор.Ватсон за помощь.Вы можете настроить WEH для своего приложения (при условии, что вы можете подписать свой код).Или вы можете собрать информацию о сбое с помощью таких инструментов, как bugcollect.com , exceptioneer.com или errortc.com .

Но в конечном итоге выпросто спросите «как может произойти сбой произвольного процесса».Есть просто слишком много способов.В лучшем случае вы можете получить общий ответ («Сбой из-за разыменования защищенного адреса»).

1 голос
/ 12 июля 2010

Служба хостов может дать сбой.Неважно, исправите ли вы это или нет, в следующий раз они просто не получатся по-другому.

Я объясняю это созданием собственного подтипа ServiceHost, который включает в себя ведение журнала и автоматический перезапуск.

Public Class RestartableServiceHost
    Inherits ServiceHost

    Private m_Log As FileLogger
    Private ReadOnly m_FaultResponse As ServiceHostFaultResponse
    Private ReadOnly m_Name As String

    Public Sub New(ByVal serviceType As Type, ByVal faultResponse As ServiceHostFaultResponse, ByVal log As FileLogger)
        MyBase.New(serviceType)
        If serviceType Is Nothing Then Throw New ArgumentNullException("serviceType", "serviceType is nothing.")
        If log Is Nothing Then Throw New ArgumentNullException("log", "log is nothing.")


        m_Log = log
        m_FaultResponse = faultResponse
        m_Name = serviceType.Name & " service host"
    End Sub

    Public Sub New(ByVal singletonInstance As Object, ByVal faultResponse As ServiceHostFaultResponse, ByVal log As FileLogger)
        MyBase.New(singletonInstance)

        If singletonInstance Is Nothing Then Throw New ArgumentNullException("singletonInstance", "singletonInstance is nothing.")
        If log Is Nothing Then Throw New ArgumentNullException("log", "log is nothing.")

        m_Log = log
        m_FaultResponse = faultResponse
        m_Name = singletonInstance.GetType.Name & " service host"
    End Sub

    Private Sub AamServiceHost_Closed(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Closed
        m_Log.Write(m_Name & " has closed")
    End Sub

    Private Sub AamServiceHost_Closing(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Closing
        m_Log.Write(m_Name & " is closing")
    End Sub

    Private Sub AamServiceHost_Faulted(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Faulted
        m_Log.Write(m_Name & " has faulted.")

        Select Case m_FaultResponse
            Case ServiceHostFaultResponse.None
                'NOP
            Case ServiceHostFaultResponse.AbortReopenThrow
                Try
                    Abort()
                Catch ex As Exception
                    m_Log.Write("Unable to abort SecurityMasterChangeListener Service Host", ex, Severity.Warning)
                End Try
                Threading.Thread.Sleep(TimeSpan.FromSeconds(30))
                Try
                    Open()
                Catch ex As Exception
                    m_Log.Write("Unable to reopen SecurityMasterChangeListener Service Host.", ex, Severity.ErrorServiceFailed)
                    Throw
                End Try
        End Select

    End Sub

    Private Sub AamServiceHost_Opened(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Opened
        m_Log.Write(m_Name & " has opened")
    End Sub

    Private Sub AamServiceHost_Opening(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Opening
        m_Log.Write(m_Name & " is opening")
    End Sub

    Private Sub AamServiceHost_UnknownMessageReceived(ByVal sender As Object, ByVal e As UnknownMessageReceivedEventArgs) Handles Me.UnknownMessageReceived
        m_Log.Write("SecurityMasterChangeListener Service Host has received an unknown message. The message will be ignored.", Severity.ErrorTaskFailed)
    End Sub

End Class
...