Почему не найден мой пользовательский тип элемента расширения поведения WCF? - PullRequest
45 голосов
/ 04 октября 2008

У меня есть решение, которое содержит два проекта. Один проект - это проект веб-приложения ASP.NET, а другой - библиотека классов. У веб-приложения есть проектная ссылка на библиотеку классов. Ни один из них не имеет строгого имени.

В библиотеке классов, которую я назову «Framework», у меня есть поведение конечной точки (реализация IEndpointBehavior) и элемент конфигурации (класс, производный от BehaviorExtensionsElement). Элемент конфигурации позволяет подключать поведение конечной точки к службе через конфигурацию.

В веб-приложении у меня есть служба WCF с поддержкой AJAX. В файле web.config у меня есть служба AJAX, настроенная для использования моего собственного поведения. Раздел system.serviceModel конфигурации довольно стандартный и выглядит следующим образом:

<system.serviceModel>
 <behaviors>
  <endpointBehaviors>
   <behavior name="MyEndpointBehavior">
    <enableWebScript />
    <customEndpointBehavior />
   </behavior>
  </endpointBehaviors>
 </behaviors>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
 <services>
 <service name="WebSite.AjaxService">
  <endpoint
           address=""
           behaviorConfiguration="MyEndpointBehavior"
           binding="webHttpBinding"
           contract="WebSite.AjaxService" />
  </service>
 </services>
 <extensions>
  <behaviorExtensions>
   <add
       name="customEndpointBehavior"
       type="Framework.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
 </extensions>
</system.serviceModel>

Во время выполнения это работает отлично. Служба WCF с поддержкой AJAX правильно использует настроенное мной поведение конечной точки.

Проблема в том, что я пытаюсь добавить новую службу AJAX WCF. Если я добавлю -> Новый элемент ... и выберу "Службу WCF с поддержкой AJAX", я смогу посмотреть, как он добавляет файл .svc и код, но когда он обновляет файл web.config, я получаю эту ошибку:

Файл конфигурации не является допустимым файлом конфигурации для библиотеки служб WCF.

Тип 'Framework.MyBehaviorExtensionsElement, Framework, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null', зарегистрированный для расширения 'customEndpointBehavior', не может быть загружен.

Очевидно, что конфигурация полностью действительна, поскольку она отлично работает во время выполнения. Если я временно удаляю элемент из своей конфигурации поведения, а затем добавляю службу WCF с поддержкой AJAX, все проходит без проблем.

К сожалению, в более крупном проекте, где у нас будет несколько служб с различными конфигурациями, временное удаление всех пользовательских поведений будет подвержено ошибкам. Хотя я понимаю, что могу обойтись без мастера и сделать все вручную, не все могут, и было бы неплохо иметь возможность использовать продукт в том виде, в котором он предназначен - мастера и все такое.

Почему не найден мой пользовательский тип элемента расширения поведения WCF?

Обновления / пояснения:

  • Он работает во время выполнения, но не во время проектирования.
  • Сборка Framework находится в папке bin веб-проекта, когда я пытаюсь добавить службу.
  • Хотя я мог бы добавить службы вручную («без конфигурации»), мне нужен готовый шаблон элемента для работы - вот и вся цель вопроса.
  • Эта проблема видна в Visual Studio 2008. В VS 2010 эта проблема, похоже, решена.

Я подал эту проблему в Microsoft Connect , и оказывается, что вы должны либо поместить свой пользовательский элемент конфигурации в GAC, либо поместить его в папку IDE. Они не будут это исправлять, по крайней мере пока. Я разместил обходной путь, который они предоставили в качестве «ответа» на этот вопрос.

Ответы [ 10 ]

21 голосов
/ 14 января 2009

за обходной путь , который Microsoft разместила на проблему Connect Я подал на это сообщение, это известная проблема, и не будет никакого решения для нее, по крайней мере в текущем релиз:

Причина, по которой не удалось добавить новый пункт службы: при добавлении нового элемента и обновление файла конфигурации, система попытается загрузить файл конфигурации, поэтому он будет пытаться поиск и загрузка сборки CUSOM расширение в этом файле конфигурации. Только в тех случаях, когда сборка GACed или находится в том же пути как против exe (Программные файлы \ Microsoft Visual Studio 9.0 \ Common7 \ IDE), Система может найти это. В противном случае появится диалоговое окно с сообщением об ошибке и добавьте новый предмет "потерпит неудачу.

Я понимаю твои болевые точки. К сожалению, мы не можем принять это изменить в текущем выпуске. Мы будем исследовать это в более поздних выпусках и попытаться предложить лучшее решение затем, например, предоставляя диалог просмотра чтобы клиенты могли указать путь или лучшее сообщение об ошибке указать некоторую работу вокруг решения, и т.д ...

Можете ли вы попробовать обойти в текущем этап: GAC ваше собственное расширение сборка или скопируйте его в «Программу Файлы \ Microsoft Visual Studio 9,0 \ Common7 \ IDE "?

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

К сожалению, похоже, мне не повезло в этом.

8 голосов
/ 24 мая 2012

Я только что использовал

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")] 

Так что каждый раз у меня новый номер сборки сборки.

Но у нас есть

   <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

где Версия = 1.0.0.0 ЭТО НЕПРАВИЛЬНО !!!

Итак, у вас есть 2 варианта

  1. Вернуться к

    //[assembly: AssemblyVersion("1.0.*")] 
    [assembly: AssemblyVersion("1.0.0.0")]  Keep it manually.
    [assembly: AssemblyFileVersion("1.0.0.0")] 
    
  2. Каждая сборка вручную заменяет Версия = 1.0.0.0 на правильное число.

6 голосов
/ 26 июля 2010

В качестве справки для любого, кто сталкивается с этим в наши дни, возможное решение - ПОЛНОСТЬЮ квалифицировать вашу сборку в вашем app.config / web.config НАПРИМЕР если бы у вас было

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="clientCredential" type="Client.ClientCredentialElement, Client" />
        </behaviorExtensions>
    </extensions>

try - замена значений на необходимые

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
    </extensions>

это конкретное решение сработало для меня.

4 голосов
/ 20 октября 2008

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

Используя журналы слияния, похоже, что система ищет расширения поведения ТОЛЬКО в каталоге IDE (C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE). Копирование сборки в этот каталог на этапе после сборки работает, но выглядит ужасно.

2 голосов
/ 29 декабря 2012

Вот список шагов, сработавших для меня:

  • Установите dll в GAC, т.е. gacutil / i Bla.dll
  • Получите FQN dll, то есть gacutil / l Bla
  • Скопировать полученный FQN в Web.config
  • Добавить новую услугу в VS
  • Удалите dll из GAC, т.е. gacutil / u Bla

Все вместе только .

2 голосов
/ 05 октября 2008

У вас есть копия Framework.dll с вашим пользовательским поведением в каталоге bin вашего веб-проекта? Если нет, то это, вероятно, проблема. Visual Studio ищет реализацию поведения. Так как он указан в вашей конфигурации, он не думает искать в других проектах; он ожидает найти сборку в корзине.

В зависимости от того, как настроен ваш проект, он может работать в режиме отладки без помещения этой сборки в корзину, хотя VS обычно собирает ее и помещает туда. Но опять же, это зависит от того, как все настроено.

В любом случае, возможно, стоит просто проверить еще раз, что сборка доступна во время разработки.

1 голос
/ 08 октября 2008

Поместить сборку в GAC, вероятно, поможет, но я ценю, что это не тот ответ, который вы ищете. Не уверен, где еще VS будет искать сборки, кроме GAC и каталога, содержащего devenv.exe.

0 голосов
/ 25 сентября 2014

У меня был класс расширения в том же проекте (dll), что и мой класс обслуживания, и я не смог заставить его работать. Однажды я переместил его в другой проект и сослался на него из сервисного проекта, он работал. На всякий случай, если кто-то еще столкнется с этой проблемой.

0 голосов
/ 15 января 2014

если вы используете каркас 3.5, Культура = нейтральная в малой, а не культура = Нейтральная в КАПИТАЛЬНОЙ

0 голосов
/ 10 августа 2013

Я решил эту проблему, закомментировав соответствующие разделы в web.config, включая элемент, который использовал пользовательское расширение, элемент и элемент.

После этого я смог добавить службу WCF в проект, добавить строки обратно в web.config и опубликовать проект.

...