2009-09-28 5 views
3

J'ai un service WCF hébergé dans IIS, qui est construit dans Visual Studio. La bibliothèque de service WCF référence quelques autres assemblys, qui font partie de la même solution Visual Studio.Le service WCF ne peut pas charger les assemblys référencés à partir du GAC

Je déploie tous les assemblages dans le GAC, puis démarre un client de service et constate qu'il échoue lors de la tentative de résolution de l'un des assemblys clients référencés. J'ai ajouté un point d'arrêt dans le constructeur du service WCF, et il semble ne pas essayer de charger ses assemblys référencés en utilisant des noms qualifiés (et donc ne pas les trouver dans le GAC). Si j'exécute un Assembly.Load dans la fenêtre immédiate, une fois brisé dans le constructeur WCF, dans IIS, je suis capable de charger chacune des DLL manquantes en utilisant des noms qualifiés (publickeytoken et autres).

Pourquoi le CLR, ou ma bibliothèque de services, tente-t-il de charger les bibliothèques uniquement à l'aide de noms?

Répondre

0

Les versions du GAC sont-elles différentes de celles que vous avez créées? Si c'est le cas, vous pouvez forcer votre application à utiliser une version spécifique de votre assembly. Dans web.config, ajoutez ce qui suit:

<configuration> 
    ....... 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="SomeLibrary" publicKeyToken="31bfe996bd364e76"/> 
     <bindingRedirect oldVersion="0.5" newVersion="1.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    ........ 
</configuration> 
+0

Non, c'est la même version. Le gac est complètement nettoyé avant de construire la solution (pour éviter toute confusion). En outre, la seule version des bibliothèques est 1.0.0.0. – Benson

3

Essayez de mettre à jour l'application Web IIS web.config avec les éléments suivants

<compilation debug="true"> 
     <assemblies> 
     <add assembly="MyWcfAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=AAAAAAAAAA"/> 

De mon expérience, c'est parfois nécessaire lorsque le dll est pas copié local et doit être lu par le GAC.

Vous devez également recharger votre domaine d'application pour votre page Web afin d'utiliser le dernier assembly installé dans votre GAC. Vous pouvez recharger votre domaine d'application en faisant un iisreset, en touchant le web.config ou le gestionnaire d'iis.

+0

J'ai rencontré un problème similaire aujourd'hui et pour signaler quelque chose à l'avenir, en plus de la réponse de @ Ryu, assurez-vous de ne pas fermer automatiquement le tag . c'est-à-dire et NOT . Quelque chose de stupide mais facile à manquer ... voir ce lien: http://stackoverflow.com/questions/7697741/the-configuration-section-assemblies-cannot-be-read-because-it-is-missing-a-se – KDT

0

Nous avons parfois des problèmes de mise en cache experiance. Le système a déjà tenté d'accéder à quelque chose du GAC, il n'était pas là, il le rappelle, la prochaine fois ça ne dérange pas de vérifier. Essayez de réinitialiser les services Internet après avoir ajouté les assemblages au GAC.

De plus, il ne suffit pas que la version corresponde à la clé publique.

0

Vous pouvez essayer d'utiliser le nom d'assembly complet de votre service. D'après ce que je comprends, lorsque vous traitez avec le GAC, c'est la seule façon de procéder. En dehors de cela, vous pouvez activer les journaux de fusion pour voir d'où votre application essaie de charger l'assemblage, et pourquoi elle est en retard. Scott Hanselman a un très bon tutoriel sur how to use them.

Questions connexes