In WCF esporre un WebService è molto semplice ma utilizzarlo da WAS (Websphere Application Server) un po’ meno. Mentre AXIS 1.4 è molto più di bocca buona, il generatore del RAD/AST sembra mal digerire i namespace tempuri.org e altri piccoli particolari. Questo articolo descrive cosa occorre fare per creare un WebService perfettamente consumabile da RAD/AST (6.1).
Per prima cosa in .NET si definisce una interfaccia e la si decora con i soliti attributi ServiceContract, DataContract, OperationContract. E importante notare che la gestione di campi XML in maiuscolo non è ben supportata dal generatore Java e pertanto conviene creare DataContract con campi con iniziali in minuscolo. In alternativa si possono sfruttare gli attributi di generazione XML sui DataContract
[DataContract( Name="DatiServizio", Namespace="<http://example.com/esempio>")]; public class DatiServizio { [DataMember] [XmlElement(Name="testo")] public string Testo { set; get; } [DataMember] [XmlElement(Name="numero")] public decimal Numero { set; get; } } [ServiceContract( Name="DatiServizio", Namespace="<http://example.com/esempio>")]; public interface IServizio { [OperationContract] string FaiQualcosa(DatiServizio dati); }
Nella implementazione della interfaccia si utilizza l’attributo ServiceBehaviour per
fornire altre informazioni sui namespace:
[ServiceBehavior( Name="Servizio", Namespace="http://example.com/esempio")] class ServizioType : IServizio { // codice omesso... }
A questo punto è necessario creare un corretto file di configurazione app.config. In particolare nella sezione dedicata al WCF si inseriscono queste informazioni:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service behaviorConfiguration="Servizio" name="ServizioType"> <endpoint address="Servizio" binding="basicHttpBinding" bindingConfiguration="ServizioBinding" name="ServizioEndpoint" bindingName="Servizio" bindingNamespace="http://example.com/esempio" contract="IServizio" /> <host> <baseAddresses> <add baseAddress="http://localhost:8000/Servizio" /> </baseAddresses> </host> </service> </services> <bindings> <basicHttpBinding> <binding name="ServizioBinding" /> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="Servizio"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Con queste configurazioni tutti i namespace risultano a posto e il WSDL generato automaticamente (http://localhost:8000/Servizio?wsdl) è in grado di essere mangiato direttamente dal generatore WSDL del RAD/AST.
Dicembre 18, 2007 alle 12:35 pm
[...] e SOA dal punto di vista pratico) ho pubblicato un post che indica in modo molto semplice come come costruire un WebServices con WCF che vada d’accordo con WebSphere. Posted by Max Filed in Development, SOA, [...]