Пользовательский Factory of ServiceHost не может быть загружен из GAC

У меня есть служба WCF, размещенная в IIS, и она работает нормально. На самом деле он использует следующие файлы Global.asax и OrderService.svc по порядку.

<%@ Application Codebehind="Global.asax.cs" Inherits="MyCompany.MyOrderServices.Global" Language="C#" %>

<%@ ServiceHost Language="C#" Debug="true" Service="MyCompany.ServiceLibrary.OrderServiceImpl"   Factory="MyCompany.ServiceLibrary.GenericServiceHostFactoryImpl, MyCompany.ServiceLibrary"%>

Я пытаюсь сделать службу WCF меньше \ bin и разместить ее в IIS. Все необходимые сборки кладу в GAC. Когда я делаю запрос в сервис, я получаю следующую ошибку:

Ошибка парсера

Описание: ошибка произошла во время синтаксического анализа ресурса, необходимого для обслуживания этого запроса. Просмотрите следующие сведения об ошибках синтаксического анализа и соответствующим образом измените исходный файл.

Сообщение об ошибке парсера: не удалось загрузить сборку MyCompany.MyOrderServices. Перед доступом к странице убедитесь, что он скомпилирован.

Исходный файл: /global.asax Строка: 1

Что ж, я исправил эту ошибку, изменив файл Global.asax, как показано ниже:

<%@ Application Codebehind="Global.asax.cs" Inherits="MyCompany.MyOrderServices.Global, MyCompany.MyOrderServices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXXXXXXXXXX" Language="C#" %>

Итак, я понял: мне пришлось заменить простые имена типов на имена типов, уточненные сборкой. На самом деле после того, как я исправил ошибку Global.asax, я получаю следующую ошибку.

Не удалось загрузить файл или сборку MyCompany.ServiceLibrary или одну из его зависимостей. Система не может найти указанный файл.

Затем я включил ведение журнала Fusion и получил следующую информацию:

=== Информация о состоянии предварительной привязки ===

ЖУРНАЛ: DisplayName = MyCompany.ServiceLibrary

(Частично)

WRN: информация о частичной привязке была предоставлена ​​для сборки:

WRN: Имя сборки: MyCompany.ServiceLibrary | Идентификатор домена: 4

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

WRN: это может привести к тому, что скоросшиватель загружает неправильную сборку.

WRN: рекомендуется предоставить полностью заданный текстовый идентификатор для сборки,

WRN: состоит из простого имени, версии, культуры и токена открытого ключа.

WRN: см. Технический документ http://go.microsoft.com/fwlink/?LinkId=109270 для получения дополнительной информации и общих решений этой проблемы.

ЖУРНАЛ: Appbase = file: /// C: / OrderServicePublish /

ЖУРНАЛ: исходный PrivatePath = C: \ OrderServicePublish \ bin

Вызывающая сборка: (Неизвестно).

===

ЖУРНАЛ: Эта привязка начинается в контексте загрузки по умолчанию.

ЖУРНАЛ: Использование файла конфигурации приложения: C: \ OrderServicePublish \ web.config

ЖУРНАЛ: Использование файла конфигурации хоста: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet.config

ЖУРНАЛ: использование файла конфигурации компьютера из C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config.

ЖУРНАЛ: Политика не применяется к ссылке в настоящее время (частная, настраиваемая, частичная или привязка сборки на основе местоположения).

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 98694738 / 2a3c07d8 / MyCompany.MyServiceLibrary.DLL.

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 98694738 / 2a3c07d8 / MyCompany.MyServiceLibrary / MyCompany.MyServiceLibrary.DLL.

ЖУРНАЛ: Попытка загрузки нового файла URL: /// C: /OrderServicePublish/bin/MyCompany.MyServiceLibrary.DLL.

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /OrderServicePublish/bin/MyCompany.MyServiceLibrary/MyCompany.MyServiceLibrary.DLL.

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 98694738 / 2a3c07d8 / MyCompany.MyServiceLibrary.EXE.

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 98694738 / 2a3c07d8 / MyCompany.MyServiceLibrary / MyCompany.MyServiceLibrary.EXE.

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /OrderServicePublish/bin/MyCompany.MyServiceLibrary.EXE.

ЖУРНАЛ: попытка загрузки нового файла URL: /// C: /OrderServicePublish/bin/MyCompany.MyServiceLibrary/MyCompany.MyServiceLibrary.EXE.

Видимо папки GAC опущены. Затем я изменил файл .svc, как показано ниже:

<%@ ServiceHost Language="C#" Debug="true" Service="MyCompany.ServiceLibrary.OrderServiceImpl, MyCompany.ServiceLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXXXXXXXXXX"   Factory="MyCompany.ServiceLibrary.GenericServiceHostFactoryImpl, MyCompany.ServiceLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXXXXXXXXXX"%>

... Но у меня такая же ошибка. В чем проблема с директивой ServiceHost. Почему не удается загрузить сборку из папок GAC?

(note1: кстати; я проверил следующие ссылки, предлагающие изменить имена простых типов на имена типов, уточненные сборкой, но у меня это не сработало.

1) https://social.msdn.microsoft.com/Forums/vstudio/en-US/3c61739c-b1fe-46bd-b8eb-8e9485f8891b/wcf-service-without-bin-folder?forum=wcf

2) http://answers.flyppdevportal.com/categories/sharepoint2010/sharepoint2010programming.aspx?ID=7b968dc5-4522-4896-8684-34064f0baaf5).


person rebulanyum    schedule 22.08.2016    source источник
comment
Вы вручную проверили сборку с именем, версией, строгим именем и культурой в GAC, потому что, если есть несоответствие, он не загрузит сборку   -  person Mrinal Kamboj    schedule 22.08.2016
comment
Да @ mrinal-kamboj я проверил GAC на сборку и он там как раз :)   -  person rebulanyum    schedule 22.08.2016
comment
Можете ли вы попробовать то же репо с консольным приложением, все останется таким же, если оно загружается из GAC, я просто пытаюсь сузить круг вопросов до реальной проблемы в среде. Убедитесь, что в системе (ПУТЬ) нет другой копии, где бы она могла загружаться.   -  person Mrinal Kamboj    schedule 22.08.2016


Ответы (1)


Ха!

Похоже, я забыл отредактировать Web.config: он также содержит имена сборок.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CORSEnablingModule" type="MyCompany.ServiceLibrary.Cors.CORSEnablingModule, MyCompany.ServiceLibrary" />
  </modules>
</system.webServer>

Теперь я изменил его на полное имя, и все в порядке.

Спасибо, в любом случае.

person rebulanyum    schedule 22.08.2016
comment
Да, это так, но какое ваше редактирование в web.config помогло правильно загрузить сборку из GAC, пожалуйста, обновите. Вот почему было высказано предложение относительно консоли, поскольку у нее нет Web.Config. - person Mrinal Kamboj; 22.08.2016