2012-11-06 4 views
1

J'ai un service SOAP WCF avec environ 100 fonctions. Je veux seulement exposer certains d'entre eux aux points de terminaison REST. N'est-il pas possible de le faire avec un seul contrat?Service WCF exposant certaines fonctions en tant que REST

J'ai ajouté un comportement de repos et de repos point final comme celui-ci:

<behaviors> 
     <endpointBehaviors> 
     <behavior name="RestBehavior"> 
      <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 


<endpoint address="json" binding="webHttpBinding" behaviorConfiguration ="RestBehavior" contract="Test.IService" /> 
<endpoint address="" binding="customBinding" bindingConfiguration="BufferedHttpBinaryBusiness" 
      bindingName="BufferedHttpBinaryBusiness" contract="Test.IService" /> 

et a ajouté WebGet attribut à la fonction que je veux exposer le point final de repos:

<WebGet(BodyStyle:=WebMessageBodyStyle.Wrapped, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json, UriTemplate:="/IsRegistered?Id={Id}")> 
    <ServiceModel.OperationContract()> 
    Function IsRegistered(ByVal Id As String) As Boolean 

Mais j'ai aussi mon autre fonctions que je ne veux pas exposer comme REST.

<ServiceModel.OperationContract()> 
Function GetName(ByVal x As Long, ByVal y As String) As String 
<ServiceModel.OperationContract()> 
Function GetId(ByVal name As String) As String 

L'erreur que je suis arrivé est:

System.InvalidOperationException: Operation 'GetName' of contract 'IService' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped. 
    at System.ServiceModel.Description.WebHttpBehavior.TryGetNonMessageParameterType(MessageDescription message, OperationDescription declaringOperation, Boolean isRequest, Type& type) 
    at System.ServiceModel.Description.WebHttpBehavior.ValidateBodyStyle(OperationDescription operation, Boolean request) 
    at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass10.<>c__DisplayClass13.<GetRequestDispatchFormatter>b__d() 
    at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass10.<GetRequestDispatchFormatter>b__c() 
    at System.ServiceModel.Description.WebHttpBehavior.HideReplyMessage(OperationDescription operationDescription, Effect effect) 
    at System.ServiceModel.Description.WebHttpBehavior.GetRequestDispatchFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint) 
    at System.ServiceModel.Description.WebHttpBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) 
    at System.ServiceModel.ServiceHostBase.InitializeRuntime() 
    at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info) 

Quand j'ajouter WebGet attribut à cette fonction, la même erreur se produit pour une autre fonction de savon. Il semble que cela m'oblige à appliquer l'attribut WebGet à toutes les fonctions. En d'autres termes, cela m'oblige à exposer toutes les fonctions sous contrat pour les exposer au point de terminaison REST. Mais je veux seulement que certains d'entre eux expirent comme REST. N'est-ce pas possible?

Répondre

4

En bref, non. Vous devez avoir deux contrats différents pour que SOAP et REST fonctionnent ensemble. Vous pouvez cependant ajouter les deux extrémités dans la même config. La bonne chose est que vous avez juste besoin de définir les opérations REST dans une interface/contrat séparé et que vous avez hérité de service de cette interface, et vous n'avez pas besoin de changer votre code.

L'article ci-dessous est une excellente explication, et la façon de mettre en œuvre les deux dans votre service. Je l'ai utilisé comme exemple dans deux de mes propres services que j'ai écrits.

How to enable REST and SOAP both on the same WCF service

Questions connexes