WCF, значення атрибута служби в директиві ServiceHost не вдалося знайти


75

Я намагаюся розмістити свою службу з IIS 6, але я продовжую отримувати цей виняток.

    Server Error in '/WebServices' Application.
--------------------------------------------------------------------------------

The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[InvalidOperationException: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found.]
   System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +6714599
   System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +604
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +46
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +654

[ServiceActivationException: The service '/WebServices/dm/RecipientService.svc' cannot be activated due to an exception during compilation.  The exception message is: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found..]
   System.ServiceModel.AsyncResult.End(IAsyncResult result) +15626880
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +15546921
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +265
   System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +227
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082 

Я абсолютно не маю уявлення, крім того, що, здається, він не може знайти мої збори. Код повинен бути правильно складений із загальнодоступними класами.

Ось мій файл .svc:

<%@ ServiceHost Language="C#" Debug="true" Service="QS.DialogManager.Communication.IISHost.RecipientService" CodeBehind="RecipientService.svc.cs" %>

Я спробував створити дуже просту службу, яка не містить нічого, теж подивіться, чи це спрацює, але все одно з'являється та сама стара помилка.

The type 'IISHost.Service1', provided as the Service attribute value in the ServiceHost directive could not be found. 

Чи можете ви показати вміст service.svc?
Костянтин Таркус,

1
Якщо він посилається на попередньо скомпільований тип у збірці, ви скопіювали його до каталогу bin під vroot?
Костянтин Таркус

2
<% @ ServiceHost Language = "C #" Налагодження = "true" Service = "QS.DialogManager.Communication.IISHost.RecipientService" CodeBehind = "RecipientService.svc.cs"%>
nandarya

1
Дякуємо за публікацію цього повідомлення, ваші запитання та відповіді щойно вирішили таку ж проблему для мене.
Паук

Коментар, оскільки я не можу врятувати, очевидно ...
Джошуа Дрейк

Відповіді:


66

Варіант перший :

Це повідомлення часто виникає через проблему конфігурації IIS 7. Якщо ви звикли створювати віртуальний каталог, вказуючи на папку, де знаходиться ваша служба, це більше не працює. Тепер вам натомість потрібно використовувати опцію "Створити програму ...".

Інші варіанти :


1
Де я можу знайти цей варіант у IIS 6?
nandarya

2
Переконайтеся, що віртуальна папка в IIS6 є веб-додатком
Костянтин Таркус,

2
Ви скопіювали його до каталогу bin під vroot?
Костянтин Таркус

4
Так, зараз це працює! Я вас неправильно зрозумів раніше і вирішив проблему створення підпапки до віртуального додатка. Дуже дякую!
nandarya

3
У моєму випадку виявилося, що результат проекту був поза папкою веб-сайту (виправлено зміною папки виводу на 'bin \')
Павел Шклейник

72

Проблема також може полягати в іншому просторі імен у файлі svc, як у файлі svc.cs.

У просторі імен svc файл має бути у наступному форматі.

Service="Namespace.SvcClassName"

1
Це особливо поширене у VS Express, який не підтримує рефакторинг, а IDE нелегко відображає вміст файлу svc.
Chriseyre2000,

2
Це була моя точна проблема. Я пройшов своє рішення, відокремив простори імен між двома проектами у рішенні та забув оновити посилання .svc.
Ніп

2
Ви прибили, більшість навчальних програм в Інтернеті розміщують простір імен навколо зразка служби WCF та інтерфейсу, і його потрібно перенести на сторінку service.svc.
htm11h

2
Це мені допомогло. Я змінив простір імен, але не міг зрозуміти, як відкрити файл служби (servicename.svc) у VS2010 Express. У підсумку я зайшов у файлову систему і відкрив файл безпосередньо в Блокноті ++ та відредагував його там.
Ендрю МакНаутон

32

Я знаю, що це, мабуть, "очевидна" відповідь, але це мене трохи спокусило. Переконайтеся, що в папці bin є dll для проекту. Коли служба була опублікована, хлопець, який її опублікував, видалив dll-файли, оскільки вважав, що вони перебувають у GAC. Одного спеціально для проекту (QS.DialogManager.Communication.IISHost.RecipientService.dll, в даному випадку) там не було.

Та сама помилка з ДУЖЕ іншої причини.


1
Здається, це для мене важливо - наш проект виводить свою збірку в іншому місці. Додавання \ bin \ Debug та копіювання dll до нього, здавалося, спрацювало.
Tom W

Дякую. Я забув побудувати свою програму після гілки і дивувався, чому IIS видає ці помилки. Чоловіче, чи не почуваюся я безглуздо ...
Dudemanword

Дякую, що розмістили це, мабуть, це не було для мене очевидним.
Сауміл

11

Ця помилка виникає через невідповідність імені служби у файлі .SVC. Можливо, ви могли змінити назву класу служби, який реалізує інтерфейс. Рішення полягає у відкритті .SVC-файлу та точному співпаденні атрибуту служби та атрибуту CodeBehind. Отже, ваш файл .SVC має бути таким

<%@ ServiceHost Language="Language you are using" Debug="bool value to enable debugging" Service="Service class name that is implementing your Service interface" Codebehind="~/Appcode/Class implementing interface.cs"%>. for eg.

<%@ ServiceHost Language="C#" Debug="true" Service="Product.Service" CodeBehind="~/AppCode/Product.Service.cs"%>

Цей приклад стосується файлу .svc, який використовує мову C #, з увімкненою налагодженням, інтерфейсом реалізації класу Service, і цей клас знаходиться в папці програми з ім'ям Service.cs, а Product - це простір імен для класу Service.

Також, будь ласка, внесіть відповідні зміни у файл конфігурації служби.

<system.serviceModel>
    <services>
        <service name="Product.Service" behaviorConfiguration="ServiceBehavior">
            <endpoint address="" binding="wsHttpBinding" contract="Product.Iservice">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <behavior name="ServiceBehavior">
            <serviceMetaData httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
    </behaviors>
</system.serviceModel>

1
Це була моя проблема, пізніше я переніс свій .svc-файл у підкаталог "Клієнт". В директиві служби у файлі .svc відсутня нова папка / простір імен:Service="MyServicesProxy.Client.OpenClientService"
Iztoksson,

Точно так. Дякую
Bhuwan Pandey

Тільки зверніть увагу, що назва послуги чутлива до регістру! Як розробника vb.net це мене обдурило!
J.Hudler

9

Перевірте, чи посилаєтесь на правильний тип із директиви ServiceHost у файлі .svc. Ось як ...

  1. У проекті VS, що містить вашу веб-службу, відкрийте файл .svc у редакторі XML (клацніть файл правою кнопкою миші, Відкрити за допомогою ..., виберіть Редактор XML (текст), OK).
  2. Зверніть увагу на значення атрибута "Сервіс".
  3. Переконайтесь, що воно відповідає повній назві типу вашої послуги. Це включає простір імен + ім'я типу. Наприклад, якщо простір імен "MyCompany.Department.Services", а клас називається "MyService", тоді значення атрибута Service має бути "MyCompany.Department.Services.MyService".

Вам слід відкрити файли SVC у редакторі веб-служби (за замовчуванням), оскільки редактор XML видасть вам помилки перевірки XML.
DanM7

7

У мене був той самий виняток, це пов’язано з типом, неправильно згаданим у файлі .svc

Я виправив виправлення нижче.

якщо ваш .svc.cs має такий клас

namespace Azh.Services.MyApp
{
    public class WcfApp : FI.IWcfAppService
{
...
}
}

для цього файл .svc повинен виглядати так

<%@ ServiceHost Language="C#" Debug="true" Service="Azh.Services.MyApp.WcfApp" CodeBehind="WcfApp.svc.cs" %>

Рятувальник життя! Я перейменував свій сервісний проект та простір імен, але це не було оновлено.
arviman

5

Вам слід налаштувати шлях до папки bin для обслуговування локального bin.


1
Справді, копіювання DLL у папку з тим самим шляхом, що і файл svc, спрацювало. C:\Folder\SVC_ServiceFolder\bin. Мені довелося видалити кілька повторюваних конфігураційних тегів.
Junior Mayhé

3

Якщо ви що-небудь перейменували, перевірте AssemblyInfo.csправильність (Властивості /) , а також заголовок у службовому файлі.

ServiceName.svc

<%@ ServiceHost Language="C#" Debug="true" Service="Company.Namespace.WcfApp" CodeBehind="WcfApp.svc.cs" %>

Вирівнювання з вашим простором імен у вашому Service.svc.cs


2

Я практично вирішив те саме питання. Ось моя пропозиція - Помилка означає, що об’єкт, на який посилається атрибут Service, не знайдений. Щоб об’єкт був знайдений, програма або бібліотека повинна побудувати вихідні дані до папки bin.

Ви можете відредагувати сторінку властивостей програми та вказати вихідний шлях до 'bin'.


Так, у властивостях мого проекту було "bin \ Debug" для вихідного шляху - змінено на "bin \". Може бути пов’язано з тим, що це був дуже старий файл проекту, який зараз використовується у VS2017.
joanygaard

2

У мене була ця проблема - мій тип послуги був у GAC. Це б працювало, якби я додав dll, що містить тип, до папки bin, але як це було в GAC, це НЕ те, що я хотів. Врешті-решт я додав це до web.config для послуги

<system.web>
    <customErrors mode="RemoteOnly" />
    <compilation debug="true" targetFramework="4.0">
        <assemblies>
            <add assembly="[name in GAC], Version=[version in GAC], Culture=neutral, PublicKeyToken=[ac token]" />
        </assemblies>
    </compilation>
</system.web>

і це працювало, не потребуючи ніяких dll у папці bin.


Корисний скрипт для отримання кваліфікованих назв DLL: stackoverflow.com/a/17396640/681538
Олексій

1

Два ключі до цього для певних ароматів проблеми "Значення атрибута служби в директиві ServiceHost не вдалося знайти": (1) Якщо ви працюєте в Silverlight, вам слід скористатися послугою Silverlight WCF, а не не- Сервіс WCF Silverlight; це оновить Web.Config для прив’язок і дозволить видимому типу; (2) Установіть відповідність між назвою класу в новій службі та назвою Служби - метою тут є створення wsdl ... так, щоб ви знали, що функціональність служби піддається вашому клієнту Silverlight та Інтернету; допомагає відповідати службі класу. Якщо у вас є імена, ви повинні будете відредагувати Web.Config у 3 місцях (serviceBehaviors, послуги та прив'язки).

Було так багато щирих спроб допомогти людям у вирішенні цієї проблеми, які мені не допомогли, тому слід наголосити, що це написання стосується рішення Silverlight, і воно може не застосовуватися до тих, хто не використовує Silverlight 3 у клієнтській / веб-конфігурації .

Сподіваюся, це допоможе.


1

У мене була та сама проблема, але я не мав уявлення, що її спричинило. Я вирішив це, змінивши з Налагодження на Випуск і Запуск за допомогою Налагодження / Запуск нового екземпляра. Після цього він запускався як у Release, так і в Debug. Це була магія ...


Це трапляється, коли у мене є веб-інтерфейс та проект веб-служби в одному і тому ж рішенні. Веб-служба не компілюється, якщо вона не розуміється як залежність від веб-інтерфейсу.
StingyJack

1

Я також зіткнувся з цією проблемою, пробуючи зразок WCF Microsoft.ServiceModel.Samples.Calculator. Я використовую IIS 5.1. Я вирішив це, переконавшись, що веб-сайт, який автоматично згенеровано (servicemodelsamples), не є додатком. Клацніть правою кнопкою миші папку, натисніть «Властивості» та натисніть кнопку «Створити».


1

У мене були службові DLL-файли в папці bin, де знаходився файл svc. Переміщення DLL-файлів до кореневої папки bin вирішило проблему.


1

У моєму випадку клацніть правою кнопкою миші на віртуальному каталозі та виберіть «Перетворити на додаток»!


1
Працював у мене, завдяки Atul, це звучить як рішення для більшості запитувачів тут!
Erdinc Ay

1

Сьогодні я зіткнувся з цією помилкою, причиною було; Користувач IIS не має дозволу на доступ до папки програми. Я дав дозволи на читання кореневій папці програми.


1

Це може здатися тривіальним, але варто згадати: Ви повинні створити службу (у Visual Studio) - тоді DLL буде створено в підпапці bin.

Коли послуга "розгорнута" на сервері - у цій папці bin повинен бути цей файл DLL - інакше ця помилка буде видана ...


0

Додайте посилання на послугу у своєму сервісі або скопіюйте dll.


1
Хороші відповіді розширюють свої питання в розумних межах - можливо, ви могли б додати якусь додаткову інформацію? Наприклад, як це зробити? Чому ви повинні це робити?
Swadq

@Swadq Хороші відповіді насправді відповідають на питання, яких це не відповідає; додавання посилання на веб-сторінку відрізняється від створення служби, яка полягає в цьому питанні. Ви додаєте посилання на службу після того, як служба створена та доступна.
Річард Баркер,

0

Створення рішення перед додаванням посилання на службу вирішило мою проблему.


0

Я отримав цю помилку під час спроби додати посилання на службу для першого WCF з підтримкою Silverlight у тому ж рішенні. Я просто будую веб-проект, і він почав працювати ..


0

У мене була та ж проблема, я знайшов цю тему, спробував все, крім ніго.

Потім я проводжу ще 4 години даремно витраченого часу.

Потім я виявив, що налаштування компіляції змінилися з 64 біт на x86. Коли я змінив його на 64-бітний, він спрацював. Не знаю точно, чому, але може бути, що пул додатків IIS не був встановлений для дозволу 32-розрядних програм.


0
  1. Переконайтеся, що файл розмітки (svc) має атрибут служби з простором імен. Ім'я класу, а код позаду - ім'я класу

  2. Відновіть рішення

  3. Перезапустіть пули програм з локального IIS один раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.