Paramètres REST / SOAP pour un service WCF

j'ai un service WCF et j'ai envie d'exposer à la fois comme un service de Détente et un service SOAP. Quelqu'un a fait quelque chose comme ça avant?

409
demandé sur John Saunders 2008-10-09 14:11:30

6 réponses

vous pouvez exposer le service dans deux endpoints différents. le savon on peut utiliser la reliure qui supporte le savon par exemple basicHttpBinding, le repos peut utiliser le webHttpBinding. Je suppose que votre service de repos sera en JSON, dans ce cas, vous devez configurer les deux paramètres avec la configuration de comportement suivante

<endpointBehaviors>
  <behavior name="jsonBehavior">
    <enableWebScript/>
  </behavior>
</endpointBehaviors>

un exemple de configuration de point final dans votre scénario est

<services>
  <service name="TestService">
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
    <endpoint address="json" binding="webHttpBinding"  behaviorConfiguration="jsonBehavior" contract="ITestService"/>
  </service>
</services>

ainsi, le service sera disponible à

Appliquer [WebGet] pour le contrat d'opération pour le rendre propice au repos. par exemple

public interface ITestService
{
   [OperationContract]
   [WebGet]
   string HelloWorld(string text)
}

Note, si le service de repos n'est pas en JSON, les paramètres des opérations ne peuvent pas contenir de type complexe.

réponse à la poste pour SOAP and RESTful POX (XML)

pour le vieux XML simple comme format de retour, ceci est un exemple qui fonctionnerait à la fois pour SOAP et XML.

[ServiceContract(Namespace = "http://test")]
public interface ITestService
{
    [OperationContract]
    [WebGet(UriTemplate = "accounts/{id}")]
    Account[] GetAccount(string id);
}

Pox behavior for REST Plain Old XML

<behavior name="poxBehavior">
  <webHttp/>
</behavior>

Endpoints

<services>
  <service name="TestService">
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
    <endpoint address="xml" binding="webHttpBinding"  behaviorConfiguration="poxBehavior" contract="ITestService"/>
  </service>
</services>
Le Service

sera disponible au

RESTE " demande essayez dans le navigateur,

http://www.example.com/xml/accounts/A123

requête SOAP client configuration des ordinateurs d'extrémité pour le SAVON de service après l'ajout de la référence de service,

  <client>
    <endpoint address="http://www.example.com/soap" binding="basicHttpBinding"
      contract="ITestService" name="BasicHttpBinding_ITestService" />
  </client>

en C#

TestServiceClient client = new TestServiceClient();
client.GetAccount("A123");

une autre façon de le faire est d'exposer deux contrats de service différents et chacun avec une configuration spécifique. Cela peut générer des doublons au niveau du code, cependant à la fin de la journée, vous voulez faire ce travail.

569
répondu codemeit 2011-01-04 02:12:29

ce post a déjà une très bonne réponse par" Community wiki "et je recommande également de regarder le Blog de Rick Strahl, Il ya beaucoup de bons billets sur WCF Rest comme ce .

j'ai utilisé les deux pour obtenir ce genre de MyService-service... Ensuite, je peux utiliser L'interface REST de jQuery ou SOAP de Java.

ça vient de ma toile.Config:

<system.serviceModel>
 <services>
  <service name="MyService" behaviorConfiguration="MyServiceBehavior">
   <endpoint name="rest" address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="restBehavior"/>
   <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/>
   <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="MyService"/>
  </service>
 </services>
 <behaviors>
  <serviceBehaviors>
   <behavior name="MyServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true" />
   </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
   <behavior name="restBehavior">
    <webHttp/>
   </behavior>
  </endpointBehaviors>
 </behaviors>
</system.serviceModel>

Et voici ma classe de service (.svc-code-behind, pas d'interfaces requises):

    /// <summary> MyService documentation here ;) </summary>
[ServiceContract(Name = "MyService", Namespace = "http://myservice/", SessionMode = SessionMode.NotAllowed)]
//[ServiceKnownType(typeof (IList<MyDataContractTypes>))]
[ServiceBehavior(Name = "MyService", Namespace = "http://myservice/")]
public class MyService
{
    [OperationContract(Name = "MyResource1")]
    [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "MyXmlResource/{key}")]
    public string MyResource1(string key)
    {
        return "Test: " + key;
    }

    [OperationContract(Name = "MyResource2")]
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource/{key}")]
    public string MyResource2(string key)
    {
        return "Test: " + key;
    }
}

en fait, je n'utilise que JSON ou Xml, mais les deux sont ici pour une démonstration. Ce sont des requêtes pour obtenir des données. Pour insérer des données, j'utiliserais la méthode avec les attributs:

[OperationContract(Name = "MyResourceSave")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")]
public string MyResourceSave(string thing){
    //...
35
répondu Tuomas Hietanen 2010-02-19 11:28:51

si vous voulez seulement développer un service web unique et le faire héberger sur de nombreux points d'aboutissement différents (i.e. SOAP + REST, avec XML, JSON, CSV, HTML outputs). Vous devriez également envisager d'utiliser "ServiceStack" que j'ai construit pour exactement ce but où chaque service que vous développez est automatiquement disponible sur les deux SOAP et les points de repos hors de la boîte sans aucune configuration requise.

Le Bonjour L'exemple du monde montre comment créer un simple avec un service juste (pas de configuration nécessaire):

public class Hello {
    public string Name { get; set; }
}

public class HelloResponse {
    public string Result { get; set; }
}

public class HelloService : IService
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

aucune autre configuration n'est requise, et ce service est immédiatement disponible avec le repos dans:

Il est également livré dans-construit avec amicale sortie HTML (lorsqu'elle est appelée avec un client HTTP qui a Accept:text/html e.g un navigateur), vous êtes en mesure de mieux visualiser le résultat de vos services.

Gérer les différents verbes REST est aussi trivial, voici une application complète REST-service CRUD en 1 page de C# (moins que ce qu'il faudrait pour Configurer WCF ;):

24
répondu mythz 2013-01-08 12:43:27

MSDN semble avoir un article pour ceci maintenant:

https://msdn.microsoft.com/en-us/library/bb412196 (v=V110).aspx

Intro:

par défaut, Windows Communication Foundation (WCF) rend les endpoints disponibles uniquement pour les clients SOAP. Dans How to: Create a Basic WCF Web HTTP Service, un endpoint est mis à la disposition des clients non-SOAP. Il peut y avoir des moments où vous voulez faire la même contrat disponible dans les deux sens, comme terminal Web et comme terminal SOAP. Cette rubrique montre un exemple de comment faire cela.

6
répondu FMFF 2016-12-02 00:39:32

nous devons définir la configuration du comportement à REST endpoint

<endpointBehaviors>
  <behavior name="restfulBehavior">
   <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
  </behavior>
</endpointBehaviors>

et aussi à un service

<serviceBehaviors>
   <behavior>
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
   </behavior>
</serviceBehaviors>

après les comportements, l'étape suivante est les fixations. Par exemple basicHttpBinding à SOAP endpoint et webHttpBinding à REST .

<bindings>
   <basicHttpBinding>
     <binding name="soapService" />
   </basicHttpBinding>
   <webHttpBinding>
     <binding name="jsonp" crossDomainScriptAccessEnabled="true" />
   </webHttpBinding>
</bindings>

enfin, nous devons définir les 2 points terminaux dans la définition de service. Attention pour l'adresse= "" du point final, où reposer le service n'est pas nécessaire rien.

<services>
  <service name="ComposerWcf.ComposerService">
    <endpoint address="" behaviorConfiguration="restfulBehavior" binding="webHttpBinding" bindingConfiguration="jsonp" name="jsonService" contract="ComposerWcf.Interface.IComposerService" />
    <endpoint address="soap" binding="basicHttpBinding" name="soapService" contract="ComposerWcf.Interface.IComposerService" />
    <endpoint address="mex" binding="mexHttpBinding" name="metadata" contract="IMetadataExchange" />
  </service>
</services>

dans Interface du service nous définissons l'opération avec ses attributs.

namespace ComposerWcf.Interface
{
    [ServiceContract]
    public interface IComposerService
    {
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "/autenticationInfo/{app_id}/{access_token}", ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
        Task<UserCacheComplexType_RootObject> autenticationInfo(string app_id, string access_token);
    }
}

rejoignant toutes les parties, ce sera notre système WCF.serviceModel définition.

<system.serviceModel>

  <behaviors>
    <endpointBehaviors>
      <behavior name="restfulBehavior">
        <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <bindings>
    <basicHttpBinding>
      <binding name="soapService" />
    </basicHttpBinding>
    <webHttpBinding>
      <binding name="jsonp" crossDomainScriptAccessEnabled="true" />
    </webHttpBinding>
  </bindings>

  <protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>

  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

  <services>
    <service name="ComposerWcf.ComposerService">
      <endpoint address="" behaviorConfiguration="restfulBehavior" binding="webHttpBinding" bindingConfiguration="jsonp" name="jsonService" contract="ComposerWcf.Interface.IComposerService" />
      <endpoint address="soap" binding="basicHttpBinding" name="soapService" contract="ComposerWcf.Interface.IComposerService" />
      <endpoint address="mex" binding="mexHttpBinding" name="metadata" contract="IMetadataExchange" />
    </service>
  </services>

</system.serviceModel>

pour tester les deux paramètres, nous pouvons utiliser WCFClient à SOAP et PostMan à reste .

0
répondu Jailson Evora 2018-02-05 01:20:31

C'est ce que j'ai fait pour le faire fonctionner. Assurez-vous de mettre

webhttp automaticFormatSelectionEnabled="true" dans le comportement du point final.

[ServiceContract]
public interface ITestService
{

    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/product", ResponseFormat = WebMessageFormat.Json)]
    string GetData();
}

public class TestService : ITestService
{
    public string GetJsonData()
    {
        return "I am good...";
    }
}

à l'Intérieur du modèle de service

   <service name="TechCity.Business.TestService">

    <endpoint address="soap" binding="basicHttpBinding" name="SoapTest"
      bindingName="BasicSoap" contract="TechCity.Interfaces.ITestService" />
    <endpoint address="mex"
              contract="IMetadataExchange" binding="mexHttpBinding"/>
    <endpoint behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
              name="Http" contract="TechCity.Interfaces.ITestService" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8739/test" />
      </baseAddresses>
    </host>
  </service>

Point De Terminaison De Comportement

  <endpointBehaviors>
    <behavior name="jsonBehavior">
      <webHttp automaticFormatSelectionEnabled="true"  />
      <!-- use JSON serialization -->
    </behavior>
  </endpointBehaviors>
0
répondu Nayas Subramanian 2018-03-08 09:06:47