Что вызывает сбой WCF ServiceHost?

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

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

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

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

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

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

Спасибо


person Marcus    schedule 12.07.2010    source источник
comment
Вы добавили ведение журнала для отслеживания того, что происходит внутри службы во время ее работы? Несколько клиентов обращаются к услуге одновременно? Как это настроено? Необработанные исключения могут привести к тому, что служба перестанет отвечать. См. Это - stackoverflow.com/questions/1136048/ для получения дополнительной информации.   -  person Andy Robinson    schedule 12.07.2010
comment
Да, к одному порту подключено несколько клиентов, получающих много данных. Программа не защищена от DOS-атаки, но следует ли ожидать такого поведения в таком случае? Может, проще просто снова открыть канал, когда он пропадает ...   -  person Marcus    schedule 13.07.2010


Ответы (2)


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

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

person Remus Rusanu    schedule 12.07.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
person Jonathan Allen    schedule 12.07.2010