Подтвердить что ты не робот

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

У меня есть решение, содержащее два проекта. Один проект - проект веб-приложения 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 и codebehind, но когда он доходит до обновления файла web.config, я получаю эту ошибку:

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

Я просто использовал

[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 варианта

  • Вернуться к

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

Ответ 3

Как FYI для всех, кто сталкивается с этим в наши дни, возможным решением является полное соответствие вашей сборки в вашем app.config/web.config. НАПРИМЕР если у вас

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

попробуйте - замените значения как вспомогательные

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

если вы используете фреймворк 3.5 Культура = нейтральный в маленькой не Culture = Neutral в CAPITAL

Ответ 10

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