2009-06-01 2 views
1

Я сталкиваюсь с действительно странной проблемой с WCF. У меня есть два проекта в решении, каждый из которых запускает некоторые самообслуживаемые службы WCF.WCF выбрасывает исключение FileNotFound для «System.ServiceModel» при создании ServiceHost

Проект 1:

myService = new ServiceHost(typeof(MyService1)); 

Который работает нормально. Однако, когда я пытаюсь запустить свой 2-й проект, который содержит:

meService = new ServiceHost(typeof(MyOtherService)); 

я получаю исключение:

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

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. 

Действительно нечетная часть является то, что в отладчик, в то время, когда я получаю это исключение, я могу перейти в «QuickWatch» в Visual Studio и ввести:

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

Я попытался запустить SysInternals File System Watcher во время отладки, но он не обнаружил ошибок «FileNotFound», кроме devenv.exe, пытаясь отследить файлы .pdb для создания трассировки стека.

У кого-нибудь есть другие идеи, на что смотреть?


Update # 1

Я проверил журнал слияния для процесса, и, кажется, что-то странное происходит. Есть 2 записей журнала для System.ServiceModel, спина к спине:

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

Тогда вторая запись:

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

Таким образом, кажется, что он пытается загрузить System.ServiceModel дважды и один раз из local app dir вместо GAC? Я запутался ...

ответ

2

Найдено Моя проблема:

Для обоих проектов (позволяет называть их MyProj1 и MyProj2) У меня есть эта строка в файле .dll.config:

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

proj1 работает нормально, proj2 терпит неудачу за исключением выше.По какой-то причине только в Proj2 он просматривает только мою личную папку \ bin при попытке решить «System.ServiceModel».

Если изменить эту строку, чтобы иметь полное имя сборки:

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

Все снова работает. Как странно ... Я понятия не имею, почему точно такая же ссылка на конфигурацию работает для одного проекта, а не другая, но эй ... по крайней мере, я могу вернуться к работе сейчас :)

0

Пара вопросов:

  • ли оба ваших целевых проектов, по крайней мере .NET Framework 3.0 или выше?
  • Можете ли вы показать нам интерфейсы, которые реализуются двумя службами, и приблизительный план самих классов реализации службы?
+0

Оба целевых .net 3.5. Как ни странно, в «сломанном» проекте я могу заменить «MyOtherService» на любой сервисный интерфейс, и все они бросают ту же ошибку, что заставляет меня поверить в то, что что-то в самом проекте не так. См. Мои дополнительные исследования выше для журналов слияния. – CodingWithSpike

+0

Не могли бы вы случайно получить копию System.ServiceModel.dll в вашем каталоге bin bin где-нибудь? У меня это случалось в некоторых случаях, когда я получал 32 32-битные копии System.Data в каталоге bin моего сайта и больше не мог строить свою 64-разрядную машину. –

+0

На самом деле, наоборот. Если я скопирую файл System.ServiceModel.dll из GAC в мой путь к \ bin, теперь он работает нормально. По какой-то причине .NET пытается разрешить это из \ bin. См. Журнал Fusion выше (в настоящее время политика не применяется к ссылке). – CodingWithSpike

0

Я попытался бы удалить и повторно добавить ссылку во втором проекте к сборке System.ServiceModel. Возможно, другой разработчик добавил его, используя локальный файл вместо версии GAC, который вызвал проблемы в вашей локальной среде?

+0

Я пробовал это, это не помогло. – CodingWithSpike

Смежные вопросы