2009-03-20 5 views
1

nettcpbinding을 사용하는 비동기 WCF 서비스가 있습니다. 그리고 나는 그것들에 많은 요청을 보내고 콜백에서 EndDoWork()를 호출하여 결과를 얻는다. EndDonWork가 예외를 한 번 throw하면 그 이후의 모든 호출에서 예외가 발생합니다. 통신 객체 인 System.ServiceModel.Channels.ServiceChannel은 오류 상태이므로 통신에 사용할 수 없습니다.nettcpbinding을 사용하여 WCF 서비스를 만드는 방법은 automaticlly를 다시 연결 하시겠습니까?

첫 번째 예외 때문에 연결이 닫힌 것 같습니다. 제 질문은 : 1.이 행동을 결정 짓는 것은 무엇입니까? basicHttpBinding을 사용하면 나중에 EndDoWork를 호출하면 잘 작동합니다. keepAlive 지원과 관련이 있습니까? 2. 서비스 재 연결을 자동으로 요청하도록 설정할 수있는 구성 항목의 속성이 있습니까?

답변

1

제대로 기억한다면 운영 계약서에서 오류를 선언하면 채널 오류를 피할 수 있습니다.

이 서비스에서 채널이 잘못하지 않을 것을 던져 이미 운영 계약에 MyDefinedFault을 선언함에 따라
[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MyDefinedFault))] 
    void Operation(); 
} 

(하지 않는 한 물론 당신이는 system.serviceModel를 사용하는 예를 들면 다음과 같습니다

.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults = true로 설정하면 채널에 오류가 발생할 수 있습니다.

1

어디있는 MyDefinedFault 클래스입니다. 이 클래스를 정의하는 방법.

+1

이것은 사용자가 직접 만드는 클래스입니다. 다음과 같이 매우 간단 할 수 있습니다. [DataContract] public class MyDefinedFault { [DataMember] public string ExceptionString {get; 세트; } public MyDefinedFault (string exString) { ExceptionString = exString; } } – WillH

2

채널의 오류 상태는 더 이상 신뢰할 수 없다는 것을 나타냅니다. 예외가 던져진 이유 (연결, 서버 중지 등)가 무엇인지 언급하지 않았지만 WCF에 관한 한 끝점은 유효하지 않으므로 오류가 발생했습니다.

작업을 계속하려면 채널을 다시 만들고 서비스에 다시 연결해야합니다. 신뢰할 수있는 연결과 같은 기능을 사용하면 일부 작업이 완료 될 수 있지만 채널에 최종 오류가 발생하면 동일한 규칙이 적용됩니다.

또한 채널에 오류가 발생했을 때 보류중인 메시지를 다시 요청하려면 자체 메시지 대기열을 구현해야합니다. 채널을 사용하여 메시지를 보관하고 다시 보낼 수는 없습니다.

관련 문제