Веб-служба WCF не работает после «извлечения интерфейса» - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в 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://localhost:58513/ServiceAjax.svc метаданные не могут быть загружены ...» Чуть ниже он мне говорит: WebServiceTest.ServiceAjax не найден в списке контрактов, реализованных ServiceAjax

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

Но я не могу найти разницу с "простыми примерами WCF Web HTTP Service" в сети.

Идеи?

Обновление: я добавил это в существующий ASPX-проект, а не в "чистый" проект wcf ....

1 Ответ

0 голосов
/ 06 июля 2018

Я нашел ответ сам (после получения значка 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%> 

Добавление Config вручную и добавление к нему, в конце концов, помогло. Я следовал за шагами в

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint

Это привело к проблеме «невозможно загрузить метаданные», которую я мог бы исправить с помощью строки сверху (конечная точка 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...