2009-06-01 5 views
1

Je rencontre un problème très étrange avec WCF. J'ai 2 projets dans une solution, chacun d'entre eux démarre des services WCF auto-hébergés.WCF lève l'exception FileNotFound pour "System.ServiceModel" lors de la création de ServiceHost

Projet 1:

myService = new ServiceHost(typeof(MyService1)); 

Ce qui fonctionne très bien. Cependant, lorsque je tente de lancer mon 2ème projet, qui contient:

meService = new ServiceHost(typeof(MyOtherService)); 

Je reçois l'exception:

FileNotFoundException 
Could not load file or assembly 'System.ServiceModel' or one of its dependencies. 
The system cannot find the file specified.":"System.ServiceModel 

Fusion Log:

=== Pre-bind state information === 
LOG: User = removed\removed 
LOG: DisplayName = System.ServiceModel 
(Partial) 
LOG: Appbase = file:///C:/Work/MySln/MyProj/bin/Dev 
LOG: Initial PrivatePath = NULL 
Calling assembly : System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Work\MySln\MyProj\bin\Dev\MyProj.dll.temp.config 
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel.DLL. 
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel/System.ServiceModel.DLL. 
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel.EXE. 
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel/System.ServiceModel.EXE. 

La partie vraiment étrange est que le débogueur, au moment où je reçois cette exception, je peux aller dans 'QuickWatch' dans Visual Studio et entrer:

new MyOtherService() // returns new instance properly 
new ServiceHost()  // returns new instance properly 
new ServiceHost(typeof(MyOtherService)) // throws exception, same as above. 

J'ai essayé d'exécuter SysInternals File System Watcher pendant le débogage, mais il ne montre aucune erreur 'FileNotFound' autre que devenv.exe essayant de traquer les fichiers .pdb pour générer la trace de la pile.

Quelqu'un a-t-il d'autres idées sur ce qu'il faut regarder?


Mise à jour # 1

J'ai vérifié le journal de fusion pour le processus, et il semble quelque chose d'étrange se produit. Il y a 2 entrées du journal pour System.ServiceModel, dos à dos:

*** Assembly Binder Log Entry (6/1/2009 @ 10:26:48 AM) *** 

The operation was successful. 
Bind result: hr = 0x0. The operation completed successfully. 

Assembly manager loaded from: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 
Running under executable C:\Program Files\TestDriven.NET 2.0\ProcessInvocation.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = removed\removed 
LOG: DisplayName = System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
(Fully-specified) 
LOG: Appbase = file:///C:/Work/MySln/PFWebIntgTests/bin/Dev 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = C:\Documents and Settings\removed\Local Settings\Temp\TestDrivenShadowCopy\633794488082894732 
LOG: AppName = domain-nunit.addin.dll 
Calling assembly : PFWebIntgTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Work\MySln\PFWebIntgTests\bin\Dev\PFWebIntgTests.dll.temp.config 
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
LOG: Post-policy reference: System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
LOG: Found assembly by looking in the GAC. 
LOG: Binding succeeds. Returns assembly from C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll. 
LOG: Assembly is loaded in default load context. 

Puis une 2ème entrée:

*** Assembly Binder Log Entry (6/1/2009 @ 10:26:52 AM) *** 

The operation failed. 
Bind result: hr = 0x80070002. The system cannot find the file specified. 

Assembly manager loaded from: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 
Running under executable C:\Program Files\TestDriven.NET 2.0\ProcessInvocation.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = removed\removed 
LOG: DisplayName = System.ServiceModel 
(Partial) 
LOG: Appbase = file:///C:/Work/MySln/PFWebIntgTests/bin/Dev 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = C:\Documents and Settings\removed\Local Settings\Temp\TestDrivenShadowCopy\633794488082894732 
LOG: AppName = domain-nunit.addin.dll 
Calling assembly : System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Work\MySln\PFWebIntgTests\bin\Dev\PFWebIntgTests.dll.temp.config 
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel.DLL. 
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel/System.ServiceModel.DLL. 
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel.EXE. 
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel/System.ServiceModel.EXE. 
LOG: All probing URLs attempted and failed. 

Il semble donc qu'il essaie de charger System.ServiceModel deux fois, et une fois de la application locale dir au lieu du GAC? Je suis confus ...

Répondre

2

Trouvé Mon problème:

Pour les deux projets (permet de les appeler MyProj1 et MyProj2) J'ai cette ligne dans le fichier .dll.config:

<serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="System.ServiceModel.ServiceAuthorizationManager, System.ServiceModel" /> 

Proj1 fonctionne très bien, Proj2 échoue à l'exception ci-dessus.Pour quelque raison que ce soit dans Proj2 seulement, il regarde seulement dans mon dossier \ bin privé en essayant de résoudre "System.ServiceModel".

Si je change la ligne ci-dessus pour avoir le nom complet de montage:

<serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="System.ServiceModel.ServiceAuthorizationManager, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 

Tout fonctionne à nouveau. Quelle étrange ... Je ne sais pas pourquoi exactement la même référence de configuration fonctionne pour un projet et pas un autre, mais bon ... au moins je peux me remettre au travail maintenant :)

0

quelques questions:

  • Est-ce que vos deux projets cible au moins le framework .NET 3.0 ou supérieur?
  • pouvez-vous nous montrer les interfaces que les deux services implémentent, ainsi que les grandes lignes des classes d'implémentation de service elles-mêmes?
+0

Les deux font la cible .net 3.5. Etrangement, dans le projet «cassé», je peux remplacer «MyOtherService» par n'importe quelle interface de service, et ils lancent tous la même erreur, ce qui m'amène à croire que quelque chose dans le projet est erroné. Voir mes recherches supplémentaires ci-dessus pour les journaux de fusion. – CodingWithSpike

+0

Se pourrait-il que vous ayez par inadvertance obtenu une copie de System.ServiceModel.dll dans le répertoire bin de votre application quelque part? Je me suis parfois retrouvé avec des copies 32 bits de System.Data dans le répertoire bin de mon site Web et je ne pouvais plus les compiler sur mon ordinateur 64 bits. –

+0

En fait, le contraire est vrai. Si je copie System.ServiceModel.dll du GAC vers mon chemin \ bin, il fonctionne maintenant correctement. Pour une raison quelconque, .NET tente de le résoudre à partir de \ bin. Voir Fusion log above (Politique non appliquée à la référence pour l'instant). – CodingWithSpike

0

Je vais essayer de supprimer et de rajouter la référence dans le second projet à l'assembly System.ServiceModel. Peut-être un autre développeur l'a-t-il ajouté en utilisant un fichier local au lieu de la version GAC qui a causé des problèmes sur votre environnement local?

+0

J'ai essayé, ça n'a pas aidé. – CodingWithSpike

Questions connexes