viernes, 29 de junio de 2012

Invoke Web Service make in WCF with a client in PHP

Context.
I have a a web service  implementation in .net with WCF and publish in a SSL channel, and i want to call this WS from a client in PHP.

I tried install WSF from WSO2 and it's impossible i have an error API PHP it's diferent to API WSO2 and dont load the wsf.dll. it's a nightmare.

And so, implement a SOAPclient but i find errors that

The message with To '' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher.  Check that the sender and receiver's EndpointAddresses agree.
thanks to 
http://blogs.msdn.com/b/nabeelp/archive/2008/03/07/obscure-error-addressfilter-mismatch-at-the-endpointdispatcher.aspx
i find the solution

class Soap {

    public $proxy=null;

    public function Soap($myAction){
       
        $this->proxy = new My_SoapClient("https://www.domain.eu/Service.svc?wsdl",
       
           array(
               'trace' => 1,
               'soap_version' => SOAP_1_2 ,
               'SOAPAction'=> $myAction ,
               'location'=>'https://www.domain.eu/Service.svc'

               )
        );
        //create a Head soap message to connect  with WCF
        $actionHdr[] = new SoapHeader("http://www.w3.org/2005/08/addressing", 'Action', $myAction);
        $actionHdr[] = new SoapHeader("http://www.w3.org/2005/08/addressing", 'To', 'https://www.domain.eu/Service.svc',  1);
        $this->proxy->__setSoapHeaders($actionHdr);
    }

}




class My_SoapClient extends SoapClient {

    protected $_response = null;
    // overwrite SoapClient send message
    public function __doRequest( $request, $location, $action, $version, $one_way = nul) {

            $curl = curl_init($location);
            $headers = array(            
            "Content-type:application/soap+xml;charset=\"utf-8\"",
            "Accept: text/xml",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
            "SOAPAction: ". $action,
              );

            //http://php.net/manual/en/function.curl-setopt.php
            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);//dont change this value. read the link
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            // list of trush Certificate. only work in absolute path... i dont know
            curl_setopt($curl,CURLOPT_CAINFO,'Cert.pem');
            curl_setopt($curl,CURLOPT_VERBOSE,false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
         
            $response = curl_exec($curl);
            if (curl_errno($curl)) {
                throw new Exception(curl_error($curl));
            }
            curl_close($curl);
            if (!$one_way) {
                return ($response);
            }
        }
}
//and  for each operation, implements


class OperationOne{
    public $soap=null;

    public  function Request(){
            $this->soap = new Soap('https://www.domain.eu/OperationOne);
    }
}

//to make the invoke
 $operationOne = new OperationOne();//create soap message
$parametreOut= $operationOne->soap->proxy->openSessionOperation($parameterIn);


miércoles, 27 de junio de 2012

Generacion de WSDL en un domino y el servicio está hostepado en una maquina local

Cuando tienes un servicio creado con WCF y se generan los ficheros WSDL, si el servicio esta en una maquina local y lo que quieres hacer es que se publique contra un dominio especifico tienes que hacer lo siguiente


    1.- En mi caso no tenia instaladas las herramientas administrativas del IIS 7 y estas se instalan Panel de control\Todos los elementos de Panel de control\activar desactivar las caracteristicas de windows



2. - Sacar la consola  cmd en modo administrativo y lanzar el siguiente comando
   
    %systemroot%\system32\cscript.exe //nologo c:\inetpub\AdminScripts\adsutil.vbs set /w3svc/NUMERO/SecureBindings :443:www.dominiopublico.es

    Donde numero es el ID del servidor del IIS seguro, en mi caso el número = 2




3.- reiniciar el IIS con la instrucción
iisreset


Si no funciona se puede volver al estado anterior ejecutando
 %systemroot%\system32\cscript.exe //nologo c:\inetpub\AdminScripts\adsutil.vbs set /w3svc/NUMERO/SecureBindings :443:




[1]http://www.jstawski.com/archive/2008/05/01/wcf-wsdl-location-address-with-https.aspx

[2]http://www.codemeit.com/wcf/wcf-wsdl-xsdimport-schemalocations-link-to-local-machine-name-not-domain-name-while-hosted-in-iis.html

lunes, 28 de mayo de 2012

memory file, fichero en memioria

Como crear un fichero en la memoria
How to make a file in memory 

 byte[] bin = new byte[1024*1000];
System.IO.MemoryStream men = new System.IO.MemoryStream(bin);

men it's a file to write o read

serialize desserialize xml2Datatable and dataTable2xml

Como pasar, convertir, trasformar de xml a datatable y de datatable a xml,

convert transform, Serialize datatable to xml and deserialize xml to datatable

      private void xml2DataTable()
        {
            XmlDocument xmlAPDP = new XmlDocument();
            xmlAPDP.LoadXml(_xmlSource);
            dataSet = new DataSet();
            using (XmlReader xmlReader = new XmlNodeReader(xmlAPDP))
            {
                dataSet.ReadXml(xmlReader, XmlReadMode.ReadSchema);
                xmlReader.Close();
            }
            this._dataTable = dataSet.Tables[0];
        }

         private void dataTable2Xml()
        {
            StringBuilder sb;
            StringWriter sw;

            sb = new StringBuilder();
            sw = new StringWriter(sbSQL);

            _dataTable.WriteXml(sw, XmlWriteMode.WriteSchema);
            _xmlSource = sb.ToString();
        }

jueves, 27 de octubre de 2011

Infracción de simultaneidad: UpdateCommand afectó a 0 de los 1 registros esperados.

Llevo un buen rato con este error... al final me he dado cuenta porque era. Tengo una tabla con un campo precalculado (getDate()) Cuando inserto en DotNet no tengo ningun problema, pero cuando realizo una actualizacion, el campo al ser una formula no coincide con el valor de la tabla por lo que da este error. La única solución que veo es eliminar la fórmula y hacerlo a través de DotNet

martes, 25 de octubre de 2011

Tablas relacionadas en DotNet

Cuando hacemos el típico diseño de base de datos donde hay una tabla maestra la cual tiene una clave, se relaciona con una tablas externas  1.. N y además tiene un conjunto de tablas con solo relaciones N..N. No sabemos muy bien como empezar en DotNet.
Lo primero que hacemos es el disño de la base de datos. Este lo podemos realizar en SQL Express. A partir de aqui creamos en DotNet un nuevo objeto dataSet, y arrastramos desde el visor de tablas del Visual Studio 2010 las tabla. Automaticamente nos creará objetos Adapter y DataSet. No modificar estos objetos, ya que si cambiamos el diseño de nuestra base de datos perderemos los cambios.

lunes, 17 de octubre de 2011

Model Vew controler

Para crear una sencilla Web con el típico CRUDEL, en Visual Studio 2010 y MS-SQL 2008 express es tan fácil como crear un nuevo proyecto MVC seleccionar una base de datos y agregarla al proyecto generera el model a partir de la base de datos. Si se modifica el modelo desde VS se pueden ejecutar las actualizaciones en el propio VS. Para crear una nueva vista se pincha en el controlador agregamos una vista y el nombre que le demos se la asociamos con un nuevo nombre de funcion en la vista.