2009-12-24 4 views
1

netNamedPipeBinding을 사용하여 WCF 싱글 톤 서비스를 만들었습니다. 채널 예외가 발생하면 오류 상태의 채널을 남겨두고 모든 후속 작업에서 예외가 발생합니다. 이 문제를 어떻게 방지 할 수 있습니까? TimeoutException 또는 다른 일반적인 예외 중 하나만 작업을 실패하게하고 서비스가 응답하지 않게하려고합니다.채널 예외로 인해 WCF 서비스가 작동하지 않도록하는 방법은 무엇입니까?

+0

당신이 오류에 응답하지 서비스 채널 확신이 있습니까? 나는 매우 큰 사이트에서 싱글 톤 서비스를 항상 사용하며, 당신이 설명하는 문제를 한번도 경험하지 못했습니다. – nitzmahone

+0

오류가있는 상태에 있기 때문에 채널을 사용할 수 없다는 로그가 나타납니다. –

답변

2

다른 방법이 있습니다. 둘 이상의 요청에 대해 단일 인스턴스를 사용하는 대신 각 요청에 대해 클라이언트 프록시를 인스턴스화 할 수 있습니다. 이렇게하면 채널이 오류 상태가되면 어쨌든 버려집니다.

IDisposable 외에도 채널을 처리해서는 안되기 때문에 약간 까다 롭습니다.

그것은 작동하지 않습니다

:

대신
using(var channel = channelFactory.CreateChannel()) 
{ 
    return channel.ServiceMethod(parameter); 
} 

당신이해야 :

public static class Service<T> 
{ 
    public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>(""); 

    public static TResult Use<TResult>(Func<T, TResult> func) 
    { 
     TResult output; 
     var channel = (IClientChannel)_channelFactory.CreateChannel(); 
     bool success = false; 
     try 
     { 
      output = func((T)proxy); 
      channel.Close(); 
      success = true; 
     } 
     finally 
     { 
      if (!success) 
      { 
       proxy.Abort(); 
      } 
     } 
     return output; 
    } 
} 

return Service<IService>.Use(channel => 
{ 
    return channel.ServiceMethod(parameter); 
}); 
8

서버 측의 예외를 FaultException에 랩핑해야합니다. 철사의 양쪽 끝을 제어하고 양쪽 끝이 .NET 인 경우. NET 예외를 FaultException<T>으로 간단하게 감싸고 클라이언트로 다시 보낼 수 있습니다. 그렇게하면 채널이 계속 사용할 수 있습니다.

자세한 내용은 MSDN의 Specifying and Handling Faults in Contracts and Services을 참조하십시오. article on CodeProject 및이 블로그 게시물 Why Use WCF FaultException도 동일한 항목에서 확인하십시오.

또한 서버 측에서 구현할 수있어 예외를 전역으로 포착하여 오류로 변환 할 수 있습니다. 또한 주제에 대한 많은 블로그 게시물 (예 : IErrorHandler: a generic Fault Converter 또는 기타 (Bing 또는 Google))을 참조하십시오.

을보다 쉽게 ​​만들려면 IErrorHandler를 동작으로 구현할 수 있습니다.이 동작은 서비스 구성에서 또는 서비스 클래스에서 특성을 설정하여 서비스에서 설정 또는 해제 할 수 있습니다. 꽤 많은 구현이 인터넷 주위에 떠 다니고 있습니다. 내가 좋아하는 사람은 여기에 있습니다 : Useful WCF Behavior: IErrorHandler.

+0

다른 솔루션을 찾았습니다. 내 대답을 참조하십시오. –

+0

내 솔루션보다 장점이 무엇일까 궁금합니다. –

+0

흥미롭게도 내 솔루션을 구현할 때 내 서비스가 작동을 멈췄으므로 정상적으로 되돌리기 위해 내 솔루션을 구현해야했습니다. –

관련 문제