1

WCFを使用して4つのポートで同じインターフェイスを公開するWindowsサービスがあります。アドレスは次のとおりです。

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

このサービスは長い間運用されており、中断することがあり、問題のあるポートにTelnetで接続することさえできません。私は通常、サービスをリセットする必要があります。

同じコントラクトに多くのポートがあるという意味は実際にはわかりませんが、このソリューションはおそらく元の問題を覆い隠していました。

とにかく、サーバー側でサービスホストをクラッシュさせる原因は何でしょうか?クライアントがサービスホストをクラッシュさせる可能性がありますか、それともある種のサービス拒否に関連している可能性がありますか?

PS:この問題は散発的に発生し、開発で再現することはできません。本番環境でトレースを使用することも実用的ではありません。

ありがとう

4

2 に答える 2

2

ワトソン博士に助けを求めることができます。アプリケーションのWEHを構成できます(コードに署名できる場合)。または、 bugcollect.comexceptioneer.com 、 errortc.comなどのツールを使用してクラッシュ情報を収集できます。

しかし、最終的には、単に「任意のプロセスがクラッシュする可能性がある」と単純に尋ねることはできません。あまりにも多くの方法があります。せいぜい一般的な答えを得ることができます(「保護されたアドレスを逆参照したため、クラッシュしました」)。

于 2010-07-12T17:15:11.813 に答える
1

サービス ホストが失敗する可能性があります。これを修正するかどうかは問題ではありません。次回は別の方法で失敗するだけです。

これは、ログ記録と自動再起動機能を含む 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
于 2010-07-12T18:22:22.733 に答える