2010-07-12 20 views
1

J'ai un service Windows qui expose la même interface sur 4 ports en utilisant WCF. Les adresses sont les suivantes:Qu'est-ce qui fait planter WCF ServiceHost?

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

Ce service est en production depuis longtemps et il y a des moments, il les pauses et je ne peux pas telnet même le port du problème. Je dois généralement réinitialiser le service. Je n'ai vraiment pas le point d'avoir beaucoup de ports pour le même contrat, mais cette solution a probablement masqué le problème d'origine.

Quoi qu'il en soit, qu'est-ce qui pourrait faire que le servicehost plante sur le serveur? Un client peut-il planter le servicehost, ou peut-être lié à un déni de service? PS: ce problème se produit esporadically et je ne suis pas capable de reproduire en dev. L'utilisation d'une trace dans la production n'est pas pratique aussi.

Merci

+0

Avez-vous ajouté la journalisation pour surveiller ce qui se passe dans le service pendant qu'il s'exécute? Est-ce que plusieurs clients touchent le service en même temps? Comment est-il configuré? Les exceptions non gérées peuvent empêcher le service de répondre. Pour plus d'informations, consultez la page http://stackoverflow.com/questions/1136048/unhandled-exception-will-make-wcf-service-crash. –

+0

Oui, plusieurs clients connectés sur le même port reçoivent beaucoup de données. Le programme n'est pas protégé pour une attaque DOS, mais si tel est le cas, ce comportement devrait-il être attendu? Peut-être qu'il est plus facile de rouvrir le canal quand il tombe ... – Marcus

Répondre

2

Vous pouvez demander de l'aide Dr. Watson. Vous pouvez configurer WEH pour votre application (à condition que vous puissiez signer votre code). Ou vous pouvez collecter des informations sur l'accident à l'aide d'outils tels que bugcollect.com, exceptioneer.com ou errortc.com. Mais en fin de compte, vous ne pouvez pas simplement demander «comment un processus arbitraire peut-il planter». Il y a simplement trop de façons. Vous pouvez obtenir au mieux une réponse générique ('Il s'est écrasé parce qu'il a déréférencé une adresse protégée').

1

Les hôtes de service peuvent échouer. Cela n'a pas d'importance si vous y parvenez ou non, ils vont juste goign pour échouer d'une manière différente la prochaine fois. Je compte pour cela en créant mon propre sous-type de ServiceHost qui inclut des fonctionnalités de journalisation et de redémarrage automatique.

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