2008-11-18 12 views
3

Lorsque je crée une nouvelle instance d'un ChannelFactory:ChannelFactory n'a pas d'adresse sur le noeud final, pourquoi?

var factory = new ChannelFactory<IMyService>(); 

et que je crée une nouvelle chaîne, je une exception indiquant que l'adresse du point d'extrémité est nulle.

Ma configuration à l'intérieur de mon web.config est comme mentionné et tout est tel qu'il est censé être (en particulier l'adresse du point de terminaison).

Si je crée une nouvelle MyServiceClientBase, il charge toute la configuration de mon usine de canal:

var factoryWithClientBase = new MyServiceClientBase().ChannelFactory; 
Console.WriteLine(factoryWithClientBase.Endpoint.Address); //output the configuration inside the web.config 


var factoryWithChannelFactory = new ChannelFactory<IMyService>(); 
Console.WriteLine(factoryWithChannelFactory.Endpoint.Address); //output nothing (null) 

Pourquoi?

+0

Le canal est-il dans le code en tant que service? Peut-il voir le web.config? –

Répondre

5

J'ai finalement trouvé la réponse . ChannelFactory ne lit pas les informations de votre Web.Config/app.config. ClientBase (qui travaille ensuite avec une ChannelFactory) le fait. Tout cela m'a coûté quelques heures de travail mais j'ai finalement trouvé une raison valable.

:)

+0

Donc, il n'y a pas de solution qui fait fonctionner les choses sans 'name =" ... "' dans votre configuration ''? – derabbink

+0

Peu importe. Cela ne peut pas être fait! La raison * réelle * est indiquée dans [cette réponse] (http://stackoverflow.com/a/426311/1296709) – derabbink

9

aura-t-il fonctionner si vous fournissez le point final avec un nom comme celui-ci dans web.config:

<endpoint address="http://localhost:2000/MyService/" binding="wsHttpBinding" 
    behaviorConfiguration="wsHttpBehaviour" contract="IService" 
    name="MyWsHttpEndpoint" /> 

Et créer le canal en utilisant ChannelFactory comme ceci:

var factory = new ChannelFactory<IMyService>("MyWsHttpEndpoint"); 
+0

Je n'ai pas essayé ça. :) Ça vaut le coup d'essayer. –

+0

+1 Votre suggestion a fonctionné pour moi, bien qu'ajouté ci-dessus avec la méthode "CreateChannel()". – Didaxis

3

ChannelFactory instancié par le nouvel opérateur ne lit de web.config. AnAngel réponse ci-dessus est correcte. Vous devez simplement vous assurer que vous fournissez un nom à votre endpoint. Et assurez-vous que le contrat de point final est défini correctement (très important)

J'ai une expérience avant où mon web.config a été généré par VS et le contrat de point final est défini sur le contrat dans le ServiceReference (à la suite de ajouter Service Reference) qui n'est pas celui que je voulais. Bien qu'il ait un nom semblable à mon contrat d'origine (mais résident dans différents espaces de noms)

<endpoint address="http://localhost:2000/MyService/" binding="wsHttpBinding" 
behaviorConfiguration="wsHttpBehaviour" contract="TheCorrectNamespace.IService" 
name="MyWsHttpEndpoint" /> 

n'a pas Le asker poster son web.config donc je suppose que vous avez très probablement fait l'erreur que je l'ai fait (en précisant le mauvais contrat pour les points de terminaison)

+0

Vous avez raison. Il y a quelques effets secondaires d'avoir ajouté une référence de service en ayant VS le générer. Je n'ai pas eu le temps d'aller au fond, mais après avoir supprimé la référence et ajouté le point de terminaison manuellement dans web.config 'ChannelFactory ' commencé à fonctionner correctement. –