Размещение службы wcf на веб-сайте проблема: система.ArgumentException: ServiceHost поддерживает только типы служб класса

у меня что-то вроде этого:

MathServiceLibrary (служебная библиотека WCF)

[ServiceContract]
public interface IMathService
{
        [OperationContract]
        int Add(int x, int y);
        [OperationContract]
        int Multiply(int x, int y);
}

public class MathService : IMathService
{
        public int Add(int x, int y)
        {
            return x + y;
        } 

        public int Multiply(int x, int y)
        {
            return x * y;
        }
}

<behaviors>
   <serviceBehaviors>
      <behavior name="defaultServiceBehavior">
         <serviceMetadata httpGetEnabled="true" />
      </behavior>
   </serviceBehaviors>
</behaviors>
<services>
   <service behaviorConfiguration="defaultServiceBehavior" 
            name="MathServiceLibrary.MathService">
       <endpoint 
           address="mex" 
           binding="mexHttpBinding" 
           contract="IMetadataExchange" />
       <endpoint 
           address="math" 
           binding="wsHttpBinding" 
           contract="MathServiceLibrary.IMathService" />
       <host>
          <baseAddresses>
             <add baseAddress="http://localhost:8080/" />
          </baseAddresses>
       </host>
    </service>
 </services>

если я запустил это, я вижу тестовый клиент WCF, и все в порядке.

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

у меня есть это ms.svc

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MathServiceLibrary.IMathService" %> 

и web.config

    <system.serviceModel>
        <services>
            <service behaviorConfiguration="defaultServiceBehavior" name="MathServiceLibrary.MathService">
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                <endpoint address="" binding="wsHttpBinding" contract="MathServiceLibrary.IMathService">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="defaultServiceBehavior">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

когда я нажимаю правой кнопкой мыши на ms.svc просмотр в браузере я получаю это:

описание: произошло необработанное исключение во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации сведений об ошибке и где было задано в коде.

Сведения Об Исключении: System.ArgumentException: ServiceHost поддерживает только типы служб класса.

Ошибка Источник:

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

Трассировка Стека:

[ArgumentException: ServiceHost поддерживает только типы служб класса.]
Система.Средство servicemodel.Описание:.Описание servicedescription.GetService(Тип тип сервиса) +12229075
Система.Средство servicemodel.Метод servicehost.CreateDescription (IDictionary ' 2& implementedContracts) +55
Система.Средство servicemodel.ServiceHostBase.InitializeDescription (UriSchemeKeyedCollection baseAddresses) +154
Система.Средство servicemodel.Метод servicehost.InitializeDescription (тип serviceType, UriSchemeKeyedCollection baseAddresses) +49
Система.Средство servicemodel.Метод servicehost..ctor (тип serviceType, Uri [] baseAddresses) +151
Система.Средство servicemodel.Активация.Фабрики servicehostfactory.CreateServiceHost(Тип serviceType, Uri [] baseAddresses) +30
Система.Средство servicemodel.Активация.Фабрики servicehostfactory.CreateServiceHost(Строка constructorString, Uri[] baseAddresses) +420
Система.Средство servicemodel.HostingManager.CreateService (строка normalizedVirtualPath) +1440
Система.Средство servicemodel.HostingManager.ActivateService (строка normalizedVirtualPath) +44
Система.Средство servicemodel.HostingManager.EnsureServiceAvailable (Строка normalizedVirtualPath) +615

[ServiceActivationException: служба '/MathWebSite / ms.svc ' не может быть активирован из-за исключения во время компиляции. Этот сообщение об исключении: ServiceHost поддерживает только типы служб класса..]
Система.Во время выполнения.параметр asyncResult.Конец (результат IAsyncResult) +679246
Система.Средство servicemodel.Активация.HostedHttpRequestAsyncResult.Конец(Объекта Iasyncresult результат) +190
Система.Средство servicemodel.Активация.HostedHttpRequestAsyncResult.ExecuteSynchronous (HttpApplication контекст, строка routeServiceVirtualPath, логический flowContext, Boolean ensureWFService) +234
Система.Средство servicemodel.Активация.Модуль httpmodule.ProcessRequest (отправитель объекта, EventArgs e) +355
Система.Сеть.SyncEventExecutionStep.Система.Сеть.Класса HttpApplication.IExecutionStep.Выполнять() +148
Система.Сеть.Класса HttpApplication.ExecuteStep (шаг IExecutionStep, Boolean& completedSynchronously) +75

Я не могу понять, чего мне не хватает.

4 ответов


измените ms.svc, как показано ниже

<%@ ServiceHost Language="C#" Debug="true" Service="MathServiceLibrary.MathService" %    > 

вы должны дать имя класса вместо имени интерфейса


ваш .файл svc ошибочен. Он ссылается на интерфейс, а не реализацию. Измените его на это: <%@ ServiceHost Language="C#" Debug="true" Service="MathServiceLibrary.MathService" %>


файл svc должен иметь имя класса, а не имя интерфейса. Образец svc-файла имеет следующее содержимое:

<%@ ServiceHost Language="C#" Debug="true" Service="SampleService.Service1" CodeBehind="Service1.svc.cs" %>

надеюсь, что это поможет.


запись в вашем файле svc неверна:

вместо:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MathServiceLibrary.IMathService" %> 

вы должны:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="MathServiceLibrary.MathService" %> 

необходимо указать класс реализации сервиса на - не служба по контракту!