SharePoint/ASP.NET 환경에는 공통 인터페이스에서 파생되는 일련의 데이터 검색 자 클래스가 있습니다. WCF를 사용하여 다른 SharePoint 팜과 원격으로 통신 할 수있는 데이터 검색자를 만드는 작업이 할당되었습니다. 현재 구현 된 방법은 정적 생성자에서 싱글 톤 ChannelFactory<T>
을 만든 다음 원격 데이터 검색 프로그램의 각 인스턴스에서 다시 사용하여 개별 프록시 인스턴스를 만드는 것입니다. ChannelFactory
은 앱 도메인에서 한 번만 인스턴스화되고 생성은 guaranteed to be thread-safe이기 때문에 이것이 제대로 작동 할 것이라고 생각했습니다. 내 코드는 다음과 같습니다.싱글 톤 채널 팩터 리 <T> 만들기 및 클라이언트 연결 용으로 다시 사용
public class RemoteDataRetriever : IDataRetriever
{
protected static readonly ChannelFactory<IRemoteDataProvider>
RequestChannelFactory;
protected IRemoteDataProvider _channel;
static RemoteDataRetriever()
{
WSHttpBinding binding = new WSHttpBinding(
SecurityMode.TransportWithMessageCredential, true);
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.None;
binding.Security.Message.ClientCredentialType =
MessageCredentialType.Windows;
RequestChannelFactory =
new ChannelFactory<IRemoteDataProvider>(binding);
}
public RemoteDataRetriever(string endpointAddress)
{
_channel = RemoteDataRetriever.RequestChannelFactory.
CreateChannel(new EndpointAddress(endpointAddress));
}
}
제 질문은 좋은 디자인입니까? ChannelFactory
이 생성되면 스레드 안전성에 대해 걱정할 필요가 없다는 것을 알아 냈습니다. 왜냐하면 나는 단지 CreateChannel()
을 호출하기 위해 사용하고 있었기 때문에 실수였습니다. 상태가 바뀌거나 그렇지 않으면 스레딩 문제를 일으킬 수있는 장면에서 펑키 한 무언가를하고 있습니까? 또한 수동으로 처리하는 일부 코드 (정적 종료 자?)를 ChannelFactory
에 처리해야합니까? 아니면 IIS가 다시 부팅 될 때마다 모든 정리 작업을 수행 할 것이라고 가정 할 수 있습니까?
관련 : ChannelFactory Reuse Strategies만큼 당신의 "싱글"은 단순히 새로 건설 된 채널을 반환로
나는 똑같은 것을 나타내는 것처럼 보이는 das 금발 기사를 발견했다 - http://www.dasblonde.net/PermaLink.aspx?guid=c7922cb4-26d4-408b-b029-cfadd75ff954. 그러나, "당신을 위해 생성 된"이라는 단어는 ClientBase 전체에서 약간 벗어났습니다. 그래도 나는 네가 이걸 가지고 있다고 생각한다. –
다른 WCF 문제에 대한 연구를 수행하는 동안 ClientBase에 대해 ChannelFactory 을 선호하는 좋은 이유를 발견했습니다. - http://stackoverflow.com/questions/2252747/what-is-system-servicemodel-diagnostics-callbackexception-and-why-cant -i-handle –
@Repo Man : 원한다면 예외를 재 포장하는 것이 좋은 이유가 아닌 이상 최선의 방법은 아닙니다. WCF에서 이러한 오류가 발생하는 경우 예외를 다시 적용 할 자격이 있다고 생각하지 않습니다. – casperOne