1 votes

WCF lance une exception FileNotFound pour "System.ServiceModel" lors de la création de ServiceHost.

Je me heurte à un problème vraiment étrange avec WCF. J'ai 2 projets dans une solution, chacun d'eux démarre des services WCF auto-hébergés.

Projet 1 :

myService = new ServiceHost(typeof(MyService1));

Qui fonctionne bien. Cependant, lorsque j'essaie d'exécuter mon 2ème projet, qui contient :

meService = new ServiceHost(typeof(MyOtherService));

Je comprends 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

Journal de bord de la fusion :

=== 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.

Ce qui est vraiment étrange, c'est que dans 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 trouver les fichiers .pdb pour générer la trace de pile.

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


Mise à jour n° 1

J'ai vérifié le journal de fusion pour le processus, et il semble que quelque chose d'étrange se produise. Il y a 2 entrées de 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 à partir du répertoire de l'application locale au lieu du GAC ? Je suis confus...

2voto

CodingWithSpike Points 17720

J'ai trouvé mon problème :

Pour les deux projets (appelons-les MonProj1 et MonProj2), j'ai cette ligne dans le fichier .dll.config :

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

Proj1 fonctionne bien, Proj2 échoue avec l'exception ci-dessus. Pour une raison quelconque, dans Proj2 seulement, il ne regarde dans mon privé \bin lors de la tentative de résolution de "System.ServiceModel".

Si je change la ligne ci-dessus pour avoir le nom complet de l'assemblage :

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

Tout fonctionne à nouveau. Comme c'est étrange... Je n'ai aucune idée de pourquoi la même référence de configuration fonctionne pour un projet et pas pour un autre, mais bon... au moins je peux me remettre au travail maintenant :)

0voto

marc_s Points 321990

Quelques questions :

  • Vos deux projets visent-ils au moins le cadre .NET 3.0 ou plus ?
  • pouvez-vous nous montrer les interfaces que les deux services mettent en œuvre, ainsi que les grandes lignes des classes de mise en œuvre des services elles-mêmes ?

0voto

Spence Points 15057

J'essaierais de supprimer et de réinsérer la référence à l'assemblage System.ServiceModel dans le deuxième projet. Peut-être qu'un autre développeur l'a ajouté en utilisant un fichier local au lieu de la version GAC, ce qui a causé des problèmes dans votre environnement local ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X