Служба WCF в предварительно скомпилированном веб-приложении - не удалось загрузить файл или сборку - PullRequest
1 голос
/ 04 августа 2011

У меня есть решение, которое содержит несколько WAP ( проекты веб-приложений ).Каждый WAP имеет свой собственный проект Web Deploy , чтобы иметь возможность предварительно скомпилировать эти сайты.В одном из веб-приложений мы создали новый файл WCF с

AspNetCompatibilityRequirementsMode.Allowed

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

Не удалось загрузить файл или сборку 'App_Web _ *****, Версия = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null' или одинего зависимостей.Система не может найти указанный файл.

Я нашел какое-то объяснение по этой ссылке: Служба WCF

WCF сохраняет список ссылочных сборок ватрибут customString в результате построения (service.svc.cdcab7d2.compiled), включая App_Global.Кажется, здесь есть неверное предположение, что эти сборки будут всегда, что не обязательно имеет место в проектах веб-развертывания (aspnet_merge), где сборки будут объединены.После шага объединения все сборки фактически объединяются в одну сборку (скажем, MyWebSite.dll), когда мы выбрали эту опцию в WDP.ASP.NET обновляет только скомпилированные файлы, о которых он знает, поэтому App_Global.asax.compiled имеет правильную ссылку на MyWebSite_Deploy.dll вместо App_Global.dll.Исходные сборки удаляются после шага объединения.WCF читает список ранее сохраненных сборок и выдает, когда не может найти App_Global

Список решений, которые я пробовал:

1.Проверить ' Разрешить обновление этого скомпилированного сайта '- не работает

2. Удалить вручную ссылку App_ * из файла service.compile(Это сработало, но должно быть другое решение)

3.Добавить полное имя для сервиса / фабрики в .svcУ службы есть полное имя.

4. Попытался установить этот ключ:<SourceWebPhysicalPath>..\..\ProjectName</SourceWebPhysicalPath>

, следуя этим инструкциям

5. <compilation debug="false" batch="false">

Попытался установить значение web.config с помощью these инструкция

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

Я не хочу удалять временную папку asp.net , потому что она останавливает приложение и это недопустимо

Я также нашел Скотт Гаттри ссылка но он с '07 должен был пробиться на asp.net 4.0

Дополнительная информация Сервис размещен:ProjectName\WebResorce\Service.svc,

<%@ ServiceHost ... Factory="SolutionName.SharedWeb.WadoLabsServiceHostFactory" %>

где SharedWeb является проектом общего вебУ тебя есть другие идеи?заранее спасибо

Ответы [ 2 ]

1 голос
/ 20 октября 2016

У меня сработала следующая настройка:

  1. В файле svc укажите полное имя службы, как <%@ ServiceHost ... Service="<Namespace>.<ServiceContractClass>, <AssemblyName>" CodeBehind="ServiceContractClass.svc.vb" %>
  2. (Не могу вспомнить, почему это былотребуется, но) я убедился, что пространство имен и имя_сборки разные.

Хитрость заключается в том, чтобы указать полное имя, включая имя AsseblyName.службы, а не проекта веб-развертывания).

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

1 голос
/ 04 августа 2011

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

...