J’ai un service WCF et je veux pour l’exposer comme un service RESTfull et comme un service SOAP. Quelqu'un a fait quelque chose comme ça avant ?
Réponses
Trop de publicités?Vous pouvez exposer le service dans deux différents points de terminaison. le SAVON de on peut utiliser la liaison appui de SAVON par exemple basicHttpBinding, le repos, on peut utiliser le webHttpBinding. Je suppose que votre service REST sera en JSON, dans ce cas, vous devez configurer les deux points de terminaison avec le comportement suivant configuration
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
Un exemple de configuration des ordinateurs d'extrémité 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)
}
Remarque, si le RESTE n'est pas en JSON, les paramètres des opérations ne peuvent pas contenir de type complexe.
Réponse de la poste pour le SAVON de repos et de VARICELLE(XML)
Pour de simples données XML comme format de retour, c'est un exemple qui fonctionne à la fois pour SOAP et XML.
[ServiceContract(Namespace = "http://test")]
public interface ITestService
{
[OperationContract]
[WebGet(UriTemplate = "accounts/{id}")]
Account[] GetAccount(string id);
}
POX de comportement pour le RESTE de la Plaine Old XML
<behavior name="poxBehavior">
<webHttp/>
</behavior>
Les points de terminaison
<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 à
RESTE demande essayez-la dans le navigateur,
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 les deux contrat de service 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.
Ce post a déjà une très bonne réponse par "wiki de la Communauté" et je vous recommande également de regarder Rick Strahl Web de Blog, il y a beaucoup de bons articles sur WCF Rest comme cela.
J'ai utilisé à la fois pour obtenir ce genre de MyService-service... Alors je peux utiliser le RESTE de l'interface à partir de jQuery ou du SAVON à partir de Java.
C'est à partir de mon site Web.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 c'est mon service de classe (.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 du Json ou Xml, mais ces deux sont ici pour une démo but. Ceux sont les demandes pour obtenir les données. Pour insérer des données, je voudrais utiliser la méthode avec les attributs:
[OperationContract(Name = "MyResourceSave")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")]
public string MyResourceSave(string thing){
//...
Si vous ne souhaitez développer un service web simple et l'héberger sur beaucoup de différents paramètres (ex: SAVON + REST, XML, JSON, CSV, HTML outputes). Vous devriez également envisager l'utilisation de ServiceStack que j'ai construit pour exactement cet effet, où chaque service que vous avez à développer est automatiquement disponible sur les deux SOAP et REST points de terminaison out-of-the-box sans aucune configuration nécessaire.
Le Bonjour tout le Monde, exemple montre comment créer un simple service avec seulement (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 nécessaire, et ce service est disponible de suite avec le RESTE:
Il est également livré dans-construit avec une sympathique 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.
Le traitement des différents RESTE verbes sont aussi trivial, voici un REPOS complet-service CRUD application en 1 page de C# (à moins qu'il n'en faut pour configurer WCF ;):
MSDN semble avoir un article pour ça maintenant:
http://msdn.microsoft.com/en-us/library/bb412196(SV.100).aspx
Intro:
Par défaut, Windows Communication Foundation (WCF) rend les points de terminaison disponible uniquement pour les clients SOAP. Comment: Créer une Base de Web WCF Service HTTP, d'un point de terminaison est mis à disposition des non-clients SOAP. Il peut y avoir des moments où vous voulez faire le même contrat disponible de deux manières, comme un site Web d'extrémité et un point de terminaison SOAP. Cette rubrique montre un exemple de comment faire cela.
Lire cet article :
http://www.codemeit.com/WCF/WCF-RESTful-pox-JSON-and-SOAP-coexist.html