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.
Pubblicato da Max
Pubblicato da Max
Pubblicato da Max