Я новичок в WebServices, и у меня есть простой вопрос.
Я написал службу Hello World в Visual Studio 2017: ServiceAjax.svc.cs:
namespace WebServiceTest
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceAjax
{
[OperationContract]
[WebGet]
public string DoWork()
{
return "Hallo World";
}
}
}
ServiceAjax.svc читается так:
<%@ ServiceHost Language = "C#" Debug = "true" Service = "WebServiceTest.ServiceAjax" CodeBehind = "ServiceAjax.svc.cs" %>
Работает нормально.
Теперь я прочитал, как можно объявить интерфейс для службы. Почти каждый пример делает это ..., поэтому я попробовал:
ServiceAjax.svc.cs:
namespace WebServiceTest
{
[ServiceContract]
public interface IServiceAjax
{
[OperationContract]
[WebGet]
string DoWork();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceAjax: IServiceAjax
{
public string DoWork()
{
return "Hallo World";
}
}
}
Запустив это, я получаю сообщение об ошибке: Это немецкий язык, поэтому мой перевод может быть не совсем таким, как английское сообщение: "Из http: // локальный: 58513 / ServiceAjax.svc не удалось загрузить метаданные ..." Чуть ниже он мне говорит: WebServiceTest.ServiceAjax не найден в списке контрактов, реализованных ServiceAjax
Итак, это должно быть фолт на свалке, потому что я не могу объяснить, почему извлечение интерфейса разрушает службу, я наверняка пропустил что-то простое.
Но я не могу найти в сети отличия от «простых образцов веб-службы HTTP WCF».
Идеи?
Обновление: я добавил это в существующий проект ASPX, а не в «чистый» проект wcf ....





Я сам нашел ответ (получив значок Tumbleweed ...)
В WebConfig отсутствовала одна строка
<endpoint address = "mex"
binding = "mexHttpBinding"
name = "mex"
contract = "IMetadataExchange" />
Я пробовал использовать разные "Factorys" в SVC-разметке, но это не сработало. Возможно, не нашел подходящего ... т.е.
<%@ServiceHost language=c# Debug = "true" Service = "WebServiceTest.ServiceAjax"
Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory%>
В конце концов, добавление конфигурации вручную и добавление к ней помогло. Я выполнил шаги в
Это привело к проблеме «не удается загрузить метаданные», которую я мог исправить с помощью строки сверху (конечная точка mex). Почему mircosoft [sic] не указал на это, я не знаю ... И почему это начинает быть необходимым при использовании интерфейса, я тоже не знаю. Но я наткнулся на другие случаи, когда ему это было нужно, то есть AJAX Scripting Manger, которому также нужен аргумент пространства имен в объявлении службы:
[ServiceContract(Namespace = "AJAXService")]
Ниже того, что я добавил в web.config (уже включены строки, в которых отсутствует 4 строки).
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name = "myServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled = "true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name = "myDataAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled = "true"
multipleSiteBindingsEnabled = "true" />
<services>
<service behaviorConfiguration = "myServiceTypeBehaviors"
name = "WebServiceTest.ServiceAjax">
<endpoint address = ""
behaviorConfiguration = "myDataAspNetAjaxBehavior"
binding = "webHttpBinding"
name = "ZESData"
contract = "WebServiceTest.IZESData" />
<endpoint address = "mex"
binding = "mexHttpBinding"
name = "mex"
contract = "IMetadataExchange" />
</service>
</services>
</system.serviceModel>