506 messaggi dal 18 dicembre 2012
Ciao a tutti
Questo è il codice che utilizzo per un servizio WCF:

namespace XXXSoft
{
    [ServiceContract]
    public interface IXXXSoft
    {
        [OperationContract]
        [FaultContract(typeof(Errors))]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Configuration")]
        ConfigurationResponse Configuration(ConfigurationRequest xml);
    }
}


namespace XXXSoft
{   
    public class XXXSoftService : IXXXSoft
    {
        public ConfigurationResponse Configuration(ConfigurationRequest xml)
        {
            return ConfigurationCls.Configuration(xml);
        }        
    }
}


<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>

    <services>
      <service name="XXXSoft.XXXSoftService" behaviorConfiguration="ServiceBehaviour">
        <!-- Service Endpoints -->
        <!-- Unless fully qualified address is relative to base address supplied above -->
        <endpoint address="" binding="webHttpBinding" contract="XXXSoft.IXXXSoft" behaviorConfiguration="web"></endpoint>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- Per evitare la diffusione di informazioni sui metadati, impostare il valore seguente su false prima della distribuzione -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- Per ricevere i dettagli sull'eccezione per scopi di debug in caso di guasti, impostare il valore riportato sotto su true. Impostarlo su false prima della distribuzione per evitare di diffondere informazioni sull'eccezione -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        Per sfogliare la directory radice dell'applicazione Web durante il debug, impostare il valore riportato sotto su true.
        Impostarlo su false prima della distribuzione per evitare di diffondere informazioni sulla cartella dell'applicazione Web.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

  <connectionStrings>
    <add name="myConnection" connectionString="Data Source=SVILUPPO\SQLEXPRESS;Initial Catalog=xxx;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

</configuration>


namespace XXXSoft
{
    [DataContract(Namespace = "XXXSoft")]
    public class ConfigurationRequest
    {
        [DataMember]
        public string Username {
            get;

            set;
        }

        [DataMember]
        public string Password {
            get;

            set;
        }
        
        [DataMember]
        public string PropertyCode {
            get;

            set;
        }

    }
}


namespace XXXSoft
{
    [DataContract]
    public class ConfigurationResponse
    {
        public ConfigurationResponse()
        {
            RoomTypes = new List<tipoConfigurationRoomType>();
        }

        [DataMember]
        [XmlArrayItemAttribute("RoomType", IsNullable = false)]
        public List<tipoConfigurationRoomType> RoomTypes
        {
            get;

            set;
        }

    }
    
    public class tipoConfigurationRoomType
    {

        public tipoConfigurationRoomType()
        {
            Rates = new List<tipoConfigurationRoomTypeRate>();
        }

        [DataMember]
        public string Description
        {
            get;

            set;
        }

        [DataMember]
        [XmlArrayItemAttribute("Rate", IsNullable = false)]
        public List<tipoConfigurationRoomTypeRate> Rates
        {
            get;

            set;
        }

        [DataMember]
        [XmlAttributeAttribute()]
        public string id
        {
            get;

            set;
        }
    }
    
    public class tipoConfigurationRoomTypeRate
    {
        [DataMember]
        public string Description
        {
            get;

            set;
        }

        [DataMember]
        [XmlAttributeAttribute()]
        public string id
        {
            get;

            set;
        }

        [DataMember]
        [XmlIgnore]
        [XmlAttributeAttribute()]
        public string parent
        {
            get;

            set;
        }        
    }
}


WebClient
HttpWebRequest req = null;
            HttpWebResponse res = null;
            try
            {
                const string url = "http://localhost:54920/XXXSoft.svc/Configuration";
                req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "application/xml; charset=utf-8";
                req.Timeout = 30000;
                req.Headers.Add("SOAPAction", url);

                var xmlDoc = new XmlDocument { XmlResolver = null };
                xmlDoc.Load(Server.MapPath("PostData.xml"));
                string sXml = xmlDoc.InnerXml;
                req.ContentLength = sXml.Length;
                var sw = new StreamWriter(req.GetRequestStream());
                sw.Write(sXml);
                sw.Close();

                res = (HttpWebResponse)req.GetResponse();
                Stream responseStream = res.GetResponseStream();
                var streamReader = new StreamReader(responseStream);

                //Read the response into an xml document
                var soapResonseXmlDocument = new XmlDocument();
                soapResonseXmlDocument.LoadXml(streamReader.ReadToEnd());

                //return only the xml representing the response details (inner request)
                string response = soapResonseXmlDocument.InnerXml;
                //Response.Write(soapResonseXMLDocument.InnerXml);
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }


Ho 2 problemi:

1. se nell'xml che passo da WebClient no inserisco 'xmlns="XXXSoft"' nel nodo radice mi da errore di richiesta non valida.

2. se invio un xml con questo schema:
<ConfigurationRequest xmlns="XXXSoft">
  <Username>test</Username>
  <Password>123456</Password>
  <PropertyCode>005</PropertyCode>      
</ConfigurationRequest>

Ricevo null per Password e PropertyCode

Se passo l'xml in questo modo:
<ConfigurationRequest xmlns="XXXSoft">
  <Password>123456</Password>
  <PropertyCode>005</PropertyCode>
  <Username>test</Username>    
</ConfigurationRequest>

Nessun problema.

1. Come posso evitare di inserire 'xmlns="XXXSoft"' nel nodo radice?
2. Perchè nell'xml ricevo null per alcuno campi se inserisco i campi nell'xml in un determinato ordine?
Grazie

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.