Необъяснимая нагрузка сборки в службе WCF (IIS 7) - PullRequest
3 голосов
/ 05 августа 2010

Я работаю над новым веб-сервисом WCF, который будет размещен в существующем веб-приложении ASP.NET.Когда я пытаюсь запустить файл .svc для службы, я получаю исключение, что он не может найти файл для сборки.

Не удалось загрузить файл или сборку 'System.IdentityModel, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 'или одна из ее зависимостей.Система не может найти указанный файл.

Проблема в том, что этот сервис нигде не ссылается на эту (конкретную) сборку.Существует один ссылочный проект, который загружает System.IdentityModel, но он ссылается на версию 3.0.0.0.Фактически все эти проекты нацелены на среду выполнения 3.5, и нигде нет ссылок на какие-либо сборки 4.0.

Вот тег <compilation> из Web.config для веб-приложения:

<compilation debug="true">
  <assemblies>
    <clear/>
    <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
</compilation>

Примечание. Тег <clear /> был добавлен позже в качестве попытки устранения неполадок.По-видимому, это никак не повлияло на поведение.Я добавил его, потому что на вкладке «.NET Compilation» диспетчера конфигурации IIS сообщалось, что System.Data добавлялся дважды, хотя, очевидно, его нет в этом файле.Добавление <clear /> позаботилось об этом для меня, но я не смог найти его дубликат в Machine.config, и нет базового веб-сайта Web.config, поэтому мне интересно, есть ли где-нибудь, где я неищет, что может быть причиной проблемы.

Сервер работает под управлением Server 2008 с .NET 3.5 SP1.Я получаю ту же проблему (хотя с System.Configuration вместо IdentityModel, но тем не менее ...) на моей локальной установке IIS, которая находится на Windows 7 x64 с .NET 4.0.

Кто-нибудь знаетпочему он пытается загрузить эту сборку (когда упоминается только версия 3.0.0.0) и что я могу сделать, чтобы исправить ее?

1 Ответ

1 голос
/ 06 августа 2010

Я выяснил проблему и подумал, что она может быть полезна для других, кто может столкнуться с той же проблемой.

Когда служба WCF активирована, часть процесса использует Type.GetType(string) для получения типа, который представляетвыполнение сервисного договора.Потому что Type.GetType(string) требует, чтобы целевой тип был либо:

  • В вызывающей сборке (что в данном случае никогда не будет)
  • В mscorlib (опять же, этоникогда не будет)
  • Полностью указан с именем, полным сборки

Сбой не произойдет, если тип не будет указан с использованием имени, полного сборки.

Из-заэто (и чтобы упростить указание типов служб с помощью только имени с указанным пространством имен), активатор будет сканировать все сборки, на которые имеются ссылки, и будет вызывать Assembly.GetType(string) (который может принимать только имя с указанным пространством имен), пока не найдет совместимый тип.*

Хотя я не могу объяснить, откуда конкретно исходили ссылки на 4.0, он, должно быть, был в сборке со ссылками.Изменив тег ServiceHost в файле .svc, чтобы моя служба использовала имя с указанием сборки, WCF успешно загрузил службу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...