2010-08-13 6 views
0

어쩌면 여기에 기본적인 것이 빠져있을 수 있습니다. 나는 로컬 서비스 및 WCF를 통해 통신 윈폼 응용 프로그램을 가지고,하지만 난 내 응용 프로그램에서이 코드의 사본의 많은 끝낼 것 : 나는 아마 어떤 종류의에이 일을해야자주 호출되는 WCF 연결을 관리하십시오.

Public Shared Sub MyLocalMethod1() 
    Dim tcpBinding As New NetTcpBinding 
    tcpBinding.SendTimeout = New TimeSpan(0, 0, 5) 

    Dim tcpFactory As ChannelFactory(Of MyWCFClass.MyWCFInterface) = New _ 
         ChannelFactory(Of MyWCFClass.MyWCFInterface)(tcpBinding, "net.tcp://localhost:4079") 

    Dim ServiceWCFConnection As MyWCFClass.MyWCFInterface = tcpFactory.CreateChannel 

    ServiceWCFConnection.MyWCFMethod1() 

    tcpFactory.Close() 

End Sub 

연결을 생성하는 헬퍼 클래스는 내 서비스에서 사용하고 연결을 종료하므로이 연결 코드의 복사본이 여러 개 없습니다. 그러나이 연결을 열린 상태로 두어야합니까, 아니면 매번 닫는 것이 의미가 있습니까? WinForm은 일반적으로 몇 초마다 서비스를 호출하기 때문에 매번 새로운 연결을 끊는 대신 모든 다른 호출이 각각 액세스 할 수있는 공통 복사본을 시도하고 사용하는 것이 더 합리적 일 수 있습니다.

답변

1

두 가지 접근 방식이 모두 맞기 때문에 필요에 따라 다릅니다. 채널 생성 코드를 도우미로 묶을 수 있습니다. 현재 한 곳에서 채널 생성 코드를 편집하는 것과 동일한 기능을 수행합니다 (DRY 원칙). 각 호출이 새로운 TCP 연결을 만들므로 서비스 사용이 느립니다. 일회용 헬퍼 클래스를 사용하여 생성 된 연결을 나타냅니다.

전체 응용 프로그램에 단일 채널 (프록시)을 사용하려면 몇 가지 새로운 복잡성에 대해 생각해야합니다. 전송 세션을 생성하는 Net.Tcp 바인딩을 사용하고 있습니다 - TCP 연결은 오랜 시간 동안 지속됩니다. 또한 기본 인스 턴싱 모드는 PerSession이므로 WCF 서비스 인스턴스는 연결과 동일한 시간 동안 작동합니다. 따라서 단일 서비스 인스턴스는 클라이언트의 모든 요청을 처리합니다. 즉, 서비스는 상태 저장이됩니다. 또한 여러 통화에 대해 열린 채널을 사용할 경우 네트워크 상태, 서버 문제, 시간 초과 또는 처리되지 않은 예외로 인해 채널을 결함 상태로 전환해야합니다. 이러한 채널 및 관련 서비스 인스턴스는 더 이상 사용할 수 없습니다. 그런 채널을 중단하고 새 채널을 열어야합니다.

관련 문제