2009-11-17 2 views
17

Ich habe einen ServiceContract, der eine in einem WCF-Dienst verwendete Methode beschreibt. Die Methode verfügt über ein WebGet-Attribut, das eine UriTemplate und ResponseFormat definiert.Kann das WebGet-Attribut einer WCF OperationContract-Methode mehrere ResponseFormat-Typen aufweisen?

Ich möchte eine einzelne Methode verwenden und mehrere WebGet-Attribute mit verschiedenen UriTemplates und verschiedenen ResponseFormats haben. Im Grunde hoffe ich zu vermeiden, mehrere Methoden zu haben, nur um Dinge wie Rückgabetyp XML gegenüber JSON zu unterscheiden. In allen Beispielen, die ich bisher gesehen habe, muss ich für jedes WebGet-Attribut eine andere Methode erstellen. Hier ist ein Beispiel Operation

[ServiceContract] 
public interface ICatalogService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "product/{id}/details?format=xml", ResponseFormat = WebMessageFormat.Xml)] 
    Product GetProduct(string id); 

    [OperationContract] 
    [WebGet(UriTemplate = "product/{id}/details?format=json", ResponseFormat = WebMessageFormat.Json)] 
    Product GetJsonProduct(string id); 
} 

Im oben genannten Beispiel I für die getProduct Methode verwenden möchte sowohl die XML und JSON-Rückgabetypen wie folgt aus:

[ServiceContract] 
public interface ICatalogService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "product/{id}/details?format=xml", ResponseFormat = WebMessageFormat.Xml)] 
    [WebGet(UriTemplate = "product/{id}/details?format=json", ResponseFormat = WebMessageFormat.Json)] 
    Product GetProduct(string id); 
} 

Gibt es eine Möglichkeit, dies so zu erreichen, Ich bin nicht fest daran, verschiedene Methoden zu schreiben, nur um verschiedene ResponseFormats zurückzugeben?

Danke!

Antwort

12

können Sie dies in Ihrem Code Handle Serialisierung

[ServiceContract] 
public interface ICatalogService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "product/{id}/details?format={format}")] 
    Stream GetProduct(string id, string format); 
} 

Und dann auf dem Parameter angegebenen Wert basiert.

Für XML schreiben Sie eine Hilfsmethode, die Ihre Serialisierung behandelt.

public static Stream GetServiceStream(string format, string callback, DataTable dt, SyndicationFeed sf) 
     { 
      MemoryStream stream = new MemoryStream(); 
      StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); 
      if (format == "xml") 
      { 
       XmlSerializer xmls = new XmlSerializer(typeof(DataTable)); 
       xmls.Serialize(writer, dt); 
       WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; 
      } 
      else if (format == "json") 
      { 
       var toJSON = new JavaScriptSerializer(); 
       toJSON.RegisterConverters(new JavaScriptConverter[] { new JavaScriptDataTableConverter() }); 
       writer.Write(toJSON.Serialize(dt)); 
       WebOperationContext.Current.OutgoingResponse.ContentType = "text/json"; 
      } 
      else if (format == "jsonp") 
      { 
       var toJSON = new JavaScriptSerializer(); 
       toJSON.RegisterConverters(new JavaScriptConverter[] { new JavaScriptDataTableConverter() }); 
       writer.Write(callback + "(" + toJSON.Serialize(dt) + ");"); 
       WebOperationContext.Current.OutgoingResponse.ContentType = "text/json"; 
      } 
      else if (format == "rss") 
      { 
       XmlWriter xmlw = new XmlTextWriter(writer); 
       sf.SaveAsRss20(xmlw); 
       WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; 
      } 
      else if (format == "atom") 
      { 
       XmlWriter xmlw = new XmlTextWriter(writer); 
       sf.SaveAsAtom10(xmlw); 
       WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; 
      } 
      else 
      { 
       writer.Write("Invalid formatting specified."); 
       WebOperationContext.Current.OutgoingResponse.ContentType = "text/html"; 
      } 

      writer.Flush(); 
      stream.Position = 0; 
      return stream; 
     } 
} 
8

Wenn ich mich richtig erinnere, unter Methode für mich gearbeitet:

Vertrag für json Service:

[ServiceContract] 
public interface IServiceJson { 
    [OperationContract()] 
    [WebGet(UriTemplate = "Operation/?param={param}", 
         ResponseFormat = WebMessageFormat.Json)] 
    ReturnType Operation(string param); 
} 

Kontakt für XML-Dienst:

[ServiceContract] 
public interface IServiceXml { 
    [OperationContract(Name = "OperationX")] 
    [WebGet(UriTemplate = "Operation/?param={param}", 
         ResponseFormat = WebMessageFormat.Xml)] 
    ReturnType Operation(string param); 
} 

Implementierung für beide:

Und web.config Konfiguration (Anmerkung Endpunkte für json und XML-Antworten):

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webHttp"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="serviceBehaviour"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="serviceBehaviour" name="ServiceImplementation"> 
     <endpoint address="json/" behaviorConfiguration="webHttp" binding="webHttpBinding" 
     bindingConfiguration="webHttpBindingSettings" contract="IServiceJson"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="xml/" behaviorConfiguration="webHttp" binding="webHttpBinding" 
     bindingConfiguration="webHttpBindingSettings" contract="IServiceXml"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <bindings> 
     <webHttpBinding> 
     <binding name="webHttpBindingSettings"> 
      <readerQuotas maxStringContentLength="5000000"/> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    </system.serviceModel> 

Jetzt können Sie Ihren Service wie folgt aufrufen: json Antwort: http://yourServer/json/Operation/?param=value xml Antwort: http://yourServer/xml/Operation/?param=value

(Entschuldigung, wenn oben im Code irgendwelche Bugs aufgetreten sind, habe ich sie nicht zur Verifikation ausgeführt.

Verwandte Themen