2010-07-12 3 views
1

WCF를 사용하는 4 개의 포트에서 동일한 인터페이스를 제공하는 Windows 서비스가 있습니다. 주소는 다음과 같습니다 :WCF ServiceHost가 충돌하는 이유는 무엇입니까?

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

이 서비스는 오래 동안 생산 중이며 시간이 흐트러져 문제가있는 포트로 텔넷으로 연결할 수 없습니다. 나는 보통 서비스를 재설정해야합니다.

나는 같은 계약에 많은 포트가 있다는 요점을 얻지 못했지만이 솔루션은 아마도 원래의 문제를 가렸다.

어쨌든 서버 측에서 서비스 호스트를 중단시킬 수있는 것은 무엇입니까? 클라이언트가 서비스 호스트를 크래시 할 수 있습니까, 아니면 어떤 종류의 서비스 거부와 관련 될 수 있습니까?

추신 :이 문제는 esporadically 발생하며 dev에 재현 할 수 없습니다. 프로덕션에서 트레이스를 사용하는 것도 실용적이지 않습니다.

감사

+0

서비스가 실행되는 동안 어떤 일이 일어나고 있는지 모니터링하기 위해 로깅을 추가 했습니까? 여러 고객이 동시에 서비스를 사용합니까? 어떻게 구성 되었습니까? 처리되지 않은 예외로 인해 서비스가 응답하지 않을 수 있습니다. 자세한 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/1136048/unhandled-exception-will-make-wcf-service-crash –

+0

예, 동일한 포트에 여러 클라이언트가 연결되어있어 많은 양의 데이터가 발생합니다. 이 프로그램은 도스 공격에 대해 보호되지 않지만 이런 경우가 예상됩니까? 어쩌면 방울이 떨어질 때마다 채널을 다시 여는 것이 더 쉽습니다 ... – Marcus

답변

2

당신은 도움을 Dr. Watson을 요청할 수 있습니다. 응용 프로그램에 WEH을 구성 할 수 있습니다 (코드에 서명 할 수있는 경우). 또는 bugcollect.com, exceptioneer.com 또는 errortc.com과 같은 도구를 사용하여 충돌 정보를 수집 할 수 있습니다.

하지만 궁극적으로 '어떻게 임의 프로세스가 충돌 할 수 있습니까?'라는 질문 만 할 수는 없습니다. 단순히 너무 많은 방법이 있습니다. 당신은 최선의 답을 얻을 수 있습니다 ('보호 된 주소를 역 참조하기 때문에 추락했습니다').

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