Varios métodos para modificar dinámicamente la dirección del punto final del archivo de configuración del cliente WCF
Dado que la dirección IP del servidor cambia, el cliente necesita modificar la dirección de conexión antes de iniciar sesión.
Idea 1: modificar el archivo de configuración del cliente nfig's lt; endpointgt en el nodo. ;La dirección
El método de procesamiento es el siguiente. Sin embargo, este método tiene una desventaja, incluso si se modifica la dirección en el archivo de configuración, incluso la dirección del proxy del cliente recién creado. El objeto seguirá siendo la dirección antes de la modificación a menos que se reinicie el cliente.
El método es el siguiente
private void UpdateConfig(string serverIPAddress string serverPort)
.
{
//Configuración config = ConfigurationManager OpenExeConfiguration(Assembly GetEntryAssembly() Ubicación);
Configuración config = ConfigurationManager OpenExeConfiguration(ConfigurationUserLevel Ninguno
ConfigurationSectionGroup sct = config SectionGroups[ system serviceModel ]
ServiceModelSectionGroup serviceModelSectionGroup = sct como ServiceModelSectionGroup
ClientSection clientSection = serviceModelSectionGroup Client
foreach; elemento ChannelEndpointElement en clientSection Endpoints)
{
Patrón de cadena = :// */
Dirección de cadena = dirección del elemento ToString()
;Reemplazo de cadena = formato de cadena (://{ }:{ }/ serverIPAddress serverPort);
dirección = Regex Reemplazar (reemplazo de patrón de dirección)
dirección del elemento = nuevo); Uri(dirección);
}
config Save(ConfigurationSaveMode Modified);
ConfigurationManager RefreshSection( system serviceModel ); /p>
En cuanto a si hay una manera de actualizar esta dirección, la respuesta es no. La razón es que Net framework lee nfig cuando se inicia el cliente, e incluso si el archivo nfig se modifica más tarde, el contenido de nfig no ser actualizado
> En cuanto a por qué no se recarga, el artículo dice que no es posible en el uso normal. Si desea actualizar el contenido de nfig, necesita saber cuándo ha cambiado el contenido de nfig. Esto se puede lograr registrando un. evento de notificación de cambio de archivo Sin embargo, una vez que se detecta el contenido de nfig, debe recibir una notificación. Todos los componentes que usan nfig
Entonces surge la pregunta ¿Cómo sabe Net Framework qué componentes usan nfig? Debido a las fallas en el mecanismo de registro, es imposible hacerlo. Además, todos los componentes que necesitan leer nfig están implementados. Registre este mecanismo en Net framework. Cuando Net framework detecte el cambio de nfig, notificará a cada componente registrado que nfig. ha cambiado. Entonces, ¿qué debe hacer el componente ahora?
Para que el nuevo cambio de nfig tenga efecto, el componente debe reiniciarse significa que el componente debe poder actualizar la configuración anterior y los datos y el comportamiento basados en la configuración anterior y luego leer la nueva configuración y comenzar a actualizar desde la nueva configuración
Esto no es posible. Un ejemplo de una estrategia vinculante sería si la estrategia vinculante anterior pensara que era necesaria. para obtener la versión del ensamblado A y la nueva estrategia pensó que necesitaba obtener la versión del ensamblado A. Net framework no puede obtener la versión del ensamblado (ensamblado) A para la nueva estrategia de enlace cuando la versión ya está cargada
Solo se puede actualizar una pequeña parte de los datos de configuración. Estos incluyen efectos sin estado o efectos que se pueden eliminar fácilmente. En los cambios de tamaño de la caché, puede cambiar el tamaño de la caché para que los datos. todavía está guardado o simplemente elimine el caché anterior y abra un nuevo bloque de caché
En términos generales, la forma de garantizar la coherencia de todos los componentes cuando cambia nfig es reiniciar la aplicación. Net framework utiliza este método.
ASP Net tiene un mecanismo de detección incorporado para cambios de nfig. Monitorea nfig. Una vez que detecta el cambio, cerrará la aplicación anterior y reiniciará la nueva.
Por lo tanto, Net framework no proporcionará la función de actualización de datos de configuración en el futuro. Si cree que esto es importante para usted, debe implementarlo usted mismo.
Afortunadamente, la gente de Enterprise Library comprende esta necesidad y desarrolló una herramienta. Bloque de configuración de aplicaciones (Bloque de aplicación de configuración) en la última versión de Enterprise Library.
p>Idea 2: ¿Cómo cambiar la dirección del servidor sin reiniciar el cliente? Hay dos categorías, cada una con dos situaciones /p>
La primera categoría es para usar la clase proxy
p>Dos situaciones
() No usar autenticación
() Usar autenticación
/// lt; resumengt;
/// Plan de llamadas uno
/// lt /summarygt; / lt; nombre del parámetro = dirección del servidor gt; dirección del servidor lt; /paramgt;
privado estático void CallFirstScheme(cadena dirección del servidor)
{
/* p>
/* La opción 1 usa clase proxy*/
Console WriteLine(Opción 1
//Prueba la conexión (no usar);
con autenticación)
Console WriteLine(Crear objeto proxy userNamePwdValidator);
Dirección EndpointAddress = new EndpointAddress(net tcp://serverAddress:/UserNamePwdValidator/UserNamePwdValidatorService
<); p>UserNamePwdValidatorClient userNamePwdValidator= new UserNamePwdValidatorClient( UserNamePwdValidatorService dirección);
bool result = userNamePwdValidator Validate(string Cadena vacía
Console WriteLine( test The la conexión es exitosa);
// Verifique el nombre de usuario y la contraseña (llame a la misma interfaz que la conexión de prueba sin autenticación)
//bool result = userNamePwdValidator Validate( admin admin);
// Llame al servicio (usando autenticación)
Console WriteLine( Crear usuario de objeto proxy de servicio
Usuario UserClient = new UserClient( UserService ); /p>
p>
Dirección del punto final del usuario = nueva Dirección del punto final(new Uri( net tcp:// serverAddress: /Usuario)
Identidad de la dirección del punto final del usuario Encabezados de dirección del punto final del usuario ); p>
usuario ClientCredentials Nombre de usuario Nombre de usuario = admin
usuario ClientCredentials Nombre de usuario Contraseña = admin
usuario Insert()
Consola WriteLine(Llamada de servicio; Success/n);
/* Fin del plan 1*/
}
La segunda categoría más grande es el uso de clases de fábrica
<. p>Dos situaciones()No usar autenticación
()Usar autenticación
/// lt;summarygt
/ // Esquema de llamadas dos
p>/// lt;/summarygt
/// lt;param name= serverAddress gt;Server Addresslt;/paramgt;
private static void CallSecondScheme( string serverAddress)
{
/* La opción 2 es para usar la clase de fábrica*/
Consola
WriteLine(Opción 2);
//Conexión de prueba (sin autenticación)
Console WriteLine(crear objeto de interfaz userNamePwdValidator
ChannelFactoryt; /p>
>
WCFContracts IUserNamePwdValidator otherUserNamePwdValidator = channelFactory CreateChannel();
resultado bool = otherUserNamePwdValidator Validate(cadena Cadena vacía
Console WriteLine(conexión de prueba); Successful);
// Verifica el nombre de usuario y la contraseña (la misma interfaz que la llamada de conexión de prueba no usa autenticación)
//bool result = userNamePwdValidator Validate( admin admin);
/ / Llamar al servicio
Console WriteLine(Crear usuario de objeto de interfaz);
ChannelFactoryt; WCFContracts IUsergt; otherChannelFactory = new ChannelFactoryt;
Credenciales de otherChannelFactory Nombre de usuario Nombre de usuario = admin
Credenciales de otherChannelFactory Nombre de usuario Contraseña = admin
Dirección de punto final de otherChannelFactory = nueva Dirección de punto final(new Uri( net tcp:/ / serverAddress: /Usuario)
p>
Identidad de dirección de punto final de otherChannelFactory Encabezados de dirección de punto final de otherChannelFactory
WCFContracts IUser otherUser = otherChannelFactory CreateChannel();
p>otherUser Insert();
Console WriteLine(Llamada de servicio exitosa/n
/* Fin de la opción 2*/
}
Viene con autenticación
En la línea de comando de la herramienta VS
( ) Agregar certificado
makecert sr LocalMachine ss My a sha n CN= MyWCFServer sky exchange pe
( ) Configure el certificado para que sea confiable lishixinzhi/Article/program/net/201311/13011