Размещение службы 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" %>
необходимо указать класс реализации сервиса на - не служба по контракту!