Как предоставить конечную точку SOAP с помощью начального набора WCF? - PullRequest
1 голос
/ 16 января 2011

Я новичок в WCF, поэтому, пожалуйста, потерпите меня.

Используя последнюю версию начального набора WCF REST, я создал веб-сервис, который вызывается приложением Android. Конечная точка RESTful работает нормально, но я хотел бы создать конечную точку SOAP, чтобы клиент .NET мог использовать ее и генерировать все необходимые классы.

Я все еще использую файл конфигурации по умолчанию, и меня немного смущает, что мне с ним делать.

Вот оно

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

</configuration>

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

<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="Service1"/>
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="Service1"/>

У меня только один класс, это Service1.cs. Я пытался внести некоторые изменения, но у меня ничего не получилось.

Я хотел бы знать, что я должен добавить, и объяснение, почему это необходимо, было бы замечательно.

- Обновление -

После того, как я вставил тег services, у меня возникли проблемы с получением функции «Add Service Reference» для работы в visual studio. Я обнаружил, что «HttpGetEnabled» должен быть истинным, поэтому он будет публиковать метаданные службы в http.

Я добавил это, и похоже, что оно работает.

<behaviors>
          <serviceBehaviors>
              <behavior name="Service1Behavior">
                  <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
              </behavior>
          </serviceBehaviors>
      </behaviors>

Если я добавлю больше сервисов, нужно ли мне создавать еще две конечные точки для этого сервиса?

Спасибо.

1 Ответ

0 голосов
/ 16 января 2011

Если вы хотите выставить дополнительные конечные точки на вашем сервисе, вам нужно добавить их в тег <service name="...."> в вашей конфигурации:

<system.serviceModel>
  <services>
    <service name="NameSpace.ServiceClassName>
       <endpoint name="rest" 
                 address=""
                 binding="webHttpBinding"
                 contract="IService1" />
       <endpoint name="soap" 
                 address="soap"
                 binding="basicHttpBinding"
                 contract="IService1" />
       <endpoint name="mex" 
                 address="mex"
                 binding="mexHttpBinding"
                 contract="IMetadataExchange" />
    </service>
  </services>
</system.serviceModel>

Вы, очевидно, используете выставленные стандартные конечные точки WCF 4 - если вы хотите изменить это, вам нужно будет явно указать всю необходимую конфигурацию.

Теперь ваша служба (как реализовано в ServiceClassName в пространстве имен NameSpace) будет иметь три конечные точки:

  • базовый адрес вашего * .svc-файла будет конечной точкой REST, используя webHttpBinding
  • адресом (service.svc)/soap будет тот же контракт (те же методы обслуживания), но с использованием basicHttpBinding
  • адрес (service.svc)/mex будет содержать метаданные службы для клиентов SOAP
...