Можно ли таким образом настроить службу WCF как REST & SOAP? - PullRequest
0 голосов
/ 20 июня 2011

Я пытаюсь объединить SOAP и REST под одной крышей с некоторыми изменениями. Но я не знаю, возможно ли это. Мой код ниже, раньше он работал только в режиме REST, но поскольку я пытался добавить дополнительный веб-сервис в качестве SOAP (используя конфигурацию), он не работает. Не уверен, как его настроить ...

У меня есть интерфейсы:

[ServiceContract]
public interface IVLSContentServiceREST
{
    [OperationContract]
    [WebGet]
    string EchoWithGet(string s);

    [OperationContract]
    [WebInvoke]
    string EchoWithPost(string s);

}

[ServiceContract]
public interface IVLSContentServiceSOAP
{
    [OperationContract]
    [WebGet]
    string EchoWithGet(string s);

    [OperationContract]
    [WebInvoke]
    string EchoWithPost(string s);
}

Тогда у меня есть файл с именем VLSContentService.svc с этим:

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

И файл cs (codebehind):

public class VLSContentService : IVLSContentServiceSOAP, IVLSContentServiceREST
{

    string IVLSContentServiceSOAP.EchoWithGet(string s)
    {
        return "You said " + s;
    }

    string IVLSContentServiceSOAP.EchoWithPost(string s)
    {
        return "You said " + s;
    }


    string IVLSContentServiceREST.EchoWithGet(string s)
    {
        return "You said " + s;
    }

    string IVLSContentServiceREST.EchoWithPost(string s)
    {
        return "You said " + s;
    }

}

И конфигурация:

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

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

  <system.serviceModel>

    <!---Add the service-->
    <services>
      <service behaviorConfiguration="VLSContentServiceBehaviour" name="VLSContentService">
        <endpoint address="rest" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentServiceREST"/>
        <endpoint address="soap" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="basicHttpBinding" contract="IVLSContentServiceSOAP"/>
      </service>
    </services>

    <!---Add the behaviours-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="VLSContentServiceBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>


      <!---Add the behaviours-->
      <endpointBehaviors>
        <behavior name="VLSContentServiceEndpointBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

1 Ответ

3 голосов
/ 20 июня 2011

Вам не нужны две версии договора - просто разместите один и тот же договор на двух конечных точках, используя разные привязки

 <services>
  <service behaviorConfiguration="VLSContentServiceBehaviour" name="VLSContentService">
    <endpoint address="rest" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentService"/>
    <endpoint address="soap" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="basicHttpBinding" contract="IVLSContentService"/>
  </service>
</services>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...