2015-11-11 2 views
0

Existe-t-il un moyen générique d'ajouter dynamiquement la sécurité de transport à la liaison de point de terminaison client pour le service WCF?Code générique pour ajouter dynamiquement la sécurité de transport à la liaison de point de terminaison client dans WCF

La liaison est accessible à l'aide de la propriété proxyObject.Endpoint.Binding. La propriété Security pour chaque liaison est spécifique à chaque liaison.

Edit:

Si la liaison ne peut pas être mis à jour après proxy est créé, est-il un moyen générique pour configurer proxy lier avec la sécurité des transports. J'utilise la surcharge ci-dessous pour créer un proxy. La liaison doit être créée en fonction du point de terminaison client et de la configuration de liaison définie dans le fichier de configuration.

protected ClientBase (Liaison de liaison, EndpointAddress remoteAddress);

Mon code:

Binding binding; 

// Code to create binding using details from configuration file goes here... 

// For example, if configuration uses BasicHttpBinding, 
// then here we will create object of "BasicHttpBinding" and 
// set its Security mode as Transport 

TServiceProxyInterface serviceProxy = (TServiceProxyInterface)Activator.CreateInstance(
             TServiceProxyClass, 
             binding, 
             new EndpointAddress(serviceAddress)); 
+0

Vous ne pouvez pas modifier les propriétés et les paramètres d'un proxy une fois que vous l'avez créé. Vous devez créer un nouveau proxy avec les nouveaux paramètres. – Tim

+0

Merci Tim! J'ai mis à jour ma question. – Sambhaji

+0

Avec la surcharge que vous utilisez, vous pouvez déclarer par programmation l'objet 'binding' et le transmettre. Pouvez-vous poster plus de code que vous prévoyez d'utiliser? J'ai au moins une (peut-être plus) approches que vous pouvez utiliser, mais cela dépend en partie de ce que vous faites. Notez que la surcharge que vous prévoyez d'utiliser n'a rien à voir avec ce qui se trouve dans le fichier de configuration. – Tim

Répondre

1

Si je comprends bien votre question, vous voulez charger les données de configuration à partir du fichier de configuration puis définissez la sécurité. Je pense que vous pouvez faire quelque chose comme ceci:

BasicHttpBinding binding = new BasicHttpBinding("BindingConfigurationName"); 
binding.Security.Mode = BasicHttpSecurity.Transport; 
TServiceProxyInterface serviceProxy = (TServiceProxyInterface)Activator.CreateInstance(
            TServiceProxyClass, 
            binding, 
            new EndpointAddress(serviceAddress)); 

Cet exemple utilise la surcharge du BasicHttpSecurity qui prend le nom de la configuration de liaison à partir du fichier de configuration. Vous devriez pouvoir définir la sécurité car vous n'avez pas encore créé le proxy.

Cela devient un peu plus compliqué si vous avez différents protocoles de liaison. Au travail notre framework de base utilise une définition de client dans une section de configuration personnalisée qui spécifie le type de liaison ainsi que le nom de la configuration de liaison (entre autres), puis nous utilisons ChannelFactory<T> pour créer une fabrique (ou l'obtenir du cache si déjà créé) et générer des canaux si nécessaire. Une instruction switch est utilisée pour sélectionner le type de liaison à créer.

J'espère que cela vous met dans la bonne direction. Notez que le code ci-dessus n'est pas testé.

+0

Merci Tim! Actuellement, j'utilise le même code que vous avez donné. Je voulais écrire du code générique afin qu'il puisse fonctionner avec plusieurs protocoles et je ne devrais pas avoir besoin d'utiliser un cas de commutateur pour créer une liaison pour chaque protocole, puis définir le mode de sécurité. On dirait que nous pouvons utiliser (Binding) Activator.CreateInstance (bindingType, endpointConfigName); pour créer une liaison, mais il n'existe aucun moyen générique pour définir le mode de sécurité car il n'est pas défini dans la classe Binding qui est une classe de base pour toutes les liaisons. – Sambhaji