En nuestro entorno SharePoint/ASP.NET tenemos una serie de clases de recuperadores de datos que todos derivan de una interfaz común. Se me asignó la tarea de crear un recuperador de datos que pudiera comunicarse de forma remota con otras granjas de SharePoint mediante WCF. La forma en que lo tengo implementado en este momento es un singleton ChannelFactory<T>
se crea en un constructor estático y luego se reutiliza por cada instancia del recuperador de datos remoto para crear una instancia de proxy individual. Pensé que esto funcionaría bien porque entonces el ChannelFactory
solo se instancia una vez en un dominio de aplicación y su creación es guaranteed to be thread-safe. Mi código se parece a esto:Creación de un singleton ChannelFactory <T> y reutilización para conexiones de clientes
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));
}
}
Mi pregunta es, ¿es este un buen diseño? Pensé que una vez que se creó el ChannelFactory
no tengo que preocuparme por la seguridad de los hilos porque simplemente lo estoy usando para llamar al CreateChannel()
, pero ¿me equivoco? ¿Está cambiando el estado o haciendo algo funky detrás de escena que podría causar problemas de enhebrado? Además, ¿necesito poner algún código en algún lugar (finalizador estático?) Que elimine manualmente el ChannelFactory
o ¿puedo suponer que cada vez que se reinicie IIS, todo el trabajo de limpieza me servirá?
relacionadas: ChannelFactory Reuse Strategies
He encontrado un artículo rubia das que parece indicar la misma cosa - http://www.dasblonde.net/PermaLink.aspx?guid=c7922cb4-26d4-408b-b029-cfadd75ff954. Sin embargo, las palabras "generadas para usted" me desalentaron un poco en el enfoque de ClientBase. Aún así, creo que estás en el blanco con esto. –
Mientras investigaba otro problema de WCF, descubrí una buena razón para favorecer ChannelFactory sobre ClientBase - http://stackoverflow.com/questions/2252747/what-is-system-servicemodel-diagnostics-callbackexception-and-why-cant -i-handle –
@Repo Man: si lo prefiere, pero volver a envolver excepciones no es una buena práctica a menos que tenga una buena razón para hacerlo. Para errores de esta naturaleza en WCF, no creo que califique para el reenvío de excepciones. – casperOne