•Abril 14, 2009 •
Dejar un comentario
Tenemos un par de Clientes que usan Java y tienen que consumir los servicios web de nuestras aplicaciones (asmx), hemos tenido muchos problemas generando las clases desde Eclipse o el Intellij IDEA desde el wsdl autogenerado de los asmx.
Al final hemos encontrado la solución, usar el XFIRE, usando ese framework de Java no hemos tenido problemas
Aquí hay un quickstart de cómo utilizar el plugin en el Eclipse:
http://xfire.codehaus.org/Eclipse+Plugin
Documentación:
http://xfire.codehaus.org/User’s+Guide
Hay una nueva versión que se llama CXF
http://cxf.apache.org/
Aunque no la hemos probado, así que para ir sobre seguro usa o recomienda usar XFIRE
Escrito en Uncategorized
Etiquetas: Java, WebServices
•Febrero 5, 2009 •
Dejar un comentario
Lo que mas sufrimos son las estimaciones y la entrega de requerimientos, que nos los dan de aquella manera …
Aquí os dejo dos ejemplos, uno de Dilbert

y otro de Sinergia Sin Control

Escrito en Uncategorized
Etiquetas: Frikadas
•Febrero 3, 2009 •
Dejar un comentario
El otro día estaba trabajando con unas clases que eran contenedoras de varios tipos de clases, en un array de Objetos, vi que estábamos accediendo al objeto por posición y luego haciéndole cast, suponiendo que ese tipo de objeto siempre estaría en esa posición, pero cuando se producían errores todos los objetos se movían hacia abajo al insertar un objeto Error.
¿Para que suelto este rollo? pues porque me puse a probar LINQ para buscar en colecciones por tipo de objeto y, desde luego, es la manera mas elegante, cada día estoy mas enamorado de LINQ.
Aquí os dejo un código de ejemplo:
public static void Test()
{
List<object> Lista = new List<object>();
Lista.Add(1);
Lista.Add(2);
Lista.Add(3);
Lista.Add(4);
Lista.Add("a");
Lista.Add("b");
Lista.Add("c");
Lista.Add("d");
Lista.Add(DateTime.Today);
Lista.Add(DateTime.Today.AddDays(1));
Lista.Add(DateTime.Today.AddDays(2));
Lista.Add(DateTime.Today.AddDays(3));
var IntList = from i in Lista where i.GetType() == typeof (int) select i;
var StringList = from s in Lista where s.GetType() == typeof(string) select s;
var DateTimeList =
from d in Lista where d.GetType() == typeof(DateTime) select d;
Console.WriteLine("Hay {0} Integers",IntList.Count());
Console.WriteLine("Hay {0} Strings", StringList.Count());
Console.WriteLine("Hay {0} DateTimes", DateTimeList.Count());
Console.ReadLine();
}
Escrito en Uncategorized
Etiquetas: LINQ
•Enero 27, 2009 •
Dejar un comentario
Tenia algunos problemas con un cliente que consumía un servicio mío mandando XML por HTTP-POST, el IIS bloqueaba sus peticiones y no había manera de ver porque, así que me hice un cliente exacto al suyo para poder debugear el tema.
Por si os sirve, aquí os dejo el código Java:
import java.io.*;
import java.net.*;
import java.util.Properties;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
public static String POST(String sURL, String sData)
{
try
{
URL url = new URL(sURL);
URLConnection urlc = url.openConnection();
urlc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlc.setDoOutput(true);
OutputStream os = urlc.getOutputStream();
byte[] postData = sData.getBytes();
os.write(postData);
os.flush();
os.close();
InputStream is = urlc.getInputStream();
return parseISToString(is);
}
catch(IOException ex)
{
return ex.getMessage();
}
}
public static String parseISToString(java.io.InputStream is)
{
java.io.DataInputStream din = new java.io.DataInputStream(is);
StringBuffer sb = new StringBuffer();
try
{
String line = null;
while((line=din.readLine()) != null)
{
sb.append(line+"\n");
}
return sb.toString();
}
catch(Exception ex)
{
return ex.getMessage();
}
}
Escrito en Uncategorized
Etiquetas: Java
•Enero 9, 2009 •
Dejar un comentario
Mas de mi servicio "impersonal" …
Resulta que ahora también recibe documentos SOAP, así que tengo que extraer los datos del mensaje SOAP con este código:
private XmlDocument GetSOAPBody(XmlDocument xmlSoap)
{
const string SOAP_NAMESPACE = "http://schemas.xmlsoap.org/soap/envelope/";
XmlNodeList nodes = xmlSoap.GetElementsByTagName("Body", SOAP_NAMESPACE);
if (nodes.Count == 0) return xmlSoap;
XmlElement body = (XmlElement)nodes.Item(0);
nodes = body.ChildNodes;
for (int i = 0; i < nodes.Count; i++)
{
XmlNode node = nodes.Item(i);
if (node is XmlElement)
{
xmlSoap = new XmlDocument();
xmlSoap.LoadXml(node.OuterXml);
IsSOAP = true;
return xmlSoap;
}
}
return xmlSoap;
}
Funciona bastante bien, ahora estoy con el de generar las respuestas de OK y de Error, ya lo publicare
Escrito en Uncategorized
Etiquetas: C#, SOAP, XML
•Noviembre 27, 2008 •
Dejar un comentario
Me he estado volviendo medio loco estos días intentando conectar con el servicio de un tercero, la documentación no era todo lo clara que uno espera…
Intente pasarle las Credenciales como NetworkCredentials en el HttpRequest y nada, añadiendo cabeceras de autentificación al mensaje SOAP y nada, al final las espera en una cabecera Http.
¿Como se pasan allí? pues así:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("la url del servicio");
req.Headers.Add("SOAPAction", "la accion");
req.ContentType = "application/soap+xml";
req.Accept = "text/xml";
req.Method = "POST";
byte[] authBytes = Encoding.UTF8.GetBytes(("Usuario:Pass").ToCharArray());
req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(authBytes));
Escrito en Uncategorized
Etiquetas: C#, SOAP, WebServices
•Noviembre 25, 2008 •
Dejar un comentario
Con CSharpCodeProvider y ICodeCompiler podemos escribir y ejecutar código al vuelo.
Cuando vi esto en una demo de Microsoft no me pareció algo excesivamente útil, pero estos días me he encontrado con un problema que he podido resolver gracias a esto.
Resulta que tengo un servicio al que le envían documentos XML y no tengo una manera fija para saber quien envía esos documentos, algunos es por el Document Element, otros por un valor de XPath, y cosas así, así que para resolverlo dejo que el usuario configure la condición y la compilo y la ejecuto.
Aquí dejo un ejemplo de código:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
namespace Macros
{
public interface IStrCode
{
bool Eval(string Condicion);
}
public class StrCodeManager
{
public static void Test()
{
bool result = IsValid("\"1234\".Length == 4");
result = IsValid("2 + 2 == 5");
result = IsValid("\"Hola Que tal\".IndexOf(\"Hola\") != 0");
}
public static bool IsValid(string Condicion)
{
string SourceString =
@"using Macros;
public class StrCode : IStrCode
{
public bool Eval(string Condicion)
{
return @@Condicion@@;
}
}"
.Replace("@@Condicion@@", Condicion);
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
//Aqui añadimos las referencias necesarias
parameters.ReferencedAssemblies.Add("System.dll");
//Esta es la referencia a esta dll para que tenga acceso al interface
parameters.ReferencedAssemblies.Add("My.dll");
CompilerResults results = icc.CompileAssemblyFromSource(parameters, SourceString);
if (results.Errors.Count != 0)
{
StringBuilder stringBuilder = new StringBuilder();
foreach (CompilerError CompErr in results.Errors)
{
stringBuilder.AppendLine(CompErr.ErrorText);
}
throw new Exception(stringBuilder.ToString());
}
Assembly As = results.CompiledAssembly;
foreach (Type tipo in As.GetTypes())
{
if (tipo.GetInterface("IStrCode") != null)
{
IStrCode eval = (IStrCode) Activator.CreateInstance(tipo);
return eval.Eval(Condicion);
}
}
throw new Exception("");
}
}
}
Escrito en Uncategorized
Etiquetas: C#
•Noviembre 21, 2008 •
Dejar un comentario
configSource es un atributo que nos permite indicar otro fichero .config para una sección.
Por ejemplo, que queremos tener nuestra configuración especifica en un fichero aparte para que sea menos lioso
<appSettings configSource ="mySettings.config" />
Que queremos tener las cadenas de conexión de SQL en otro sitio
<connectionStrings configSource="MyConns.config" />
Esto nos permite tener un web.config menos lioso, dejar que gente de menos nivel configure las aplicaciones sin tocar el web.config e incluso pasar a producción sin tener que acordarte de todos los cambios que tienes que hacer en el web.config.
Escrito en Uncategorized
Etiquetas: ASP.NET
•Noviembre 20, 2008 •
Dejar un comentario
Si queremos hacer peticiones a un sitio https y no tenemos el certificado o no queremos usarlo la manera es la siguiente:
1- Crear una clase que implemente ICertificatePolicy donde la validación siempre devuelva true para pasársela al CertificatePolicy del ServicePointManager
public class TrustAllCertificatePolicy :ICertificatePolicy
{
public TrustAllCertificatePolicy()
{
}
#region ICertificatePolicy Members
public bool CheckValidationResult(ServicePoint sp,
X509Certificate cert,
WebRequest req,
int problem)
{
return true;
}
#endregion
}
2-Pasarle la clase al ServicePointManager antes de hacer la petición
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
A partir de eso podemos hacer las peticiones sin el certificado.
Escrito en Uncategorized
Etiquetas: C#, HTTP
•Octubre 30, 2008 •
Dejar un comentario
El otro día tenia que escribir un código para cargar unos archivos XML y procesarlos, pero debía procesarlos según la fecha en que habían sido creados.
Como el GetFiles no tiene un método para recoger los archivos ordenados tuve que cargarlos en una clase y obtener su fecha de creación para luego ordenarlos, aquí el código:
public class MyFile
{
public string Fichero { get; set; }
public DateTime Creado { get; set;}
}
private static void LoadFiles()
{
string Path = @"c:\ficheros";
string[] ficheros = Directory.GetFiles(Path, "*.xml");
List<MyFile> Files = new List<MyFile>();
foreach (string fichero in ficheros)
{
Files.Add(
new MyFile() {Creado = File.GetCreationTime(fichero), Fichero= fichero}
);
}
Files.Sort((x, y) => x.Creado.CompareTo(y.Creado));
foreach (MyFile myFile in Files)
{
}
}
Escrito en Uncategorized
Etiquetas: C#