aelena.com

15 April 2010

WSDL de sistemas SAP

Filed under: .NET, Servicios Web — admin @ 15:41

Hoy he podido pasar un “agradable” rato buscando un problema en un WSDL de 3200 lineas para conectarme a un servicio web de SAP. Este pequeño post es más que nada un recordatorio. Al intentar generar un proxy tanto desde Visual Studio como desde las herramientas wsdl.exe o svcutil.exe, obtenía mensajes de error un tanto crípticos.

Corriendo esta linea


wsdl “D:\WSDLs\Vendor Exists\XI_VENDOR_EXISTS.wsdl” /l:c# /v /o:proxy.cs /parsableerrors

obtenia esto

Error: There is an error in XML document (3170, 16).
- Value cannot be null.
Parameter name: name

Bonito eh? Lo mismo con

svcutil “D:\WSDLs\Vendor Exists\XI_VENDOR_EXISTS.wsdl” /out:proxy.cs

y desde Visual Studio

The document at the url file:///D:/Projects/Tests/ConsoleApplication1/ConsoleApplication1/MI_Vendor_Exists.wsdl was not recognized as a known document type.
The error message from each known type may help you fix the problem:
- Report from ‘DISCO Document’ is ‘Discovery document at the URL file:///D:/Projects/Tests/ConsoleApplication1/ConsoleApplication1/MI_Vendor_Exists.wsdl could not be found.’.
- The document format is not recognized.
- Report from ‘WSDL Document’ is ‘There is an error in XML document (2, 80660).’.
- Value cannot be null.
Parameter name: name
- Report from ‘XML Schema’ is ‘The root element of a W3C XML Schema should be and its namespace should be ‘http://www.w3.org/2001/XMLSchema’.’.

Al final, nada que ver con las lineas indicadas ni con el discovery ni nada. Simeplemente un par de espacios en dos lineas como esta

<xsd:union memberTypes=" xsd:time genericTime" ...
El espacio entre la comilla y xsd es el culpable. Viendolo en retrospectiva parece fácil entender el mensaje de error de “value cannot be null,” pero hasta que se da con ello y se te ocurre buscar anomalías…. Incluso XML Spy no supo tampoco hacer nada. El caso es que creo que esto ya me ha pasado alguna vez, pero ya se sabe, dos veces la misma piedra, y tres y cuatro.

Saludos

7 January 2010

The F# Survival Guide

Filed under: .NET, F#, functional programming — admin @ 18:58

La programación funcional cada vez va ganando más importancia…es de sobra hora de irse familiarizando con los conceptos y las técnicas, así que viene perfecto el libro gratuito que podeis encontrar aquí.

F# es un lenguaje funcional basado en ML y OCaml para el mundo .net, de manera que nos da un fácil acceso a las librerías a las que estamos ya acostumbrados desde una perspectiva funcional.

No olvidemos que C# ya incorpora características típicas de la programación funcional como las lambda expressions, las funciones anónimas o la llamada lazy evaluation. Ya no hay excusas

ClientIDMode en ASP.Net 4.0

Filed under: General, .NET, Asp.Net — admin @ 9:06

La próxima versión de asp.net introducirá un cambio que creo será agradecido por muchos desarrolladores, y es la posibilidad de poder controlar la generacion de los IDs de los controles, de manera que podamos evitar las típicas cadenas “ctl00_ctl…” etc. que tanto dificultan el acceso DOM a los elementos mediante javascript o librerías como jQuery o Mootools.

El modo por defecto seguirá siendo el que ya conocemos, pero se podrá cambiar a nivel de página a alguno de los siguientes valores:

  • Static el ID no tendrá antepuesta la concatenación de los identificadores de los contenedores padres, lo que facilita el acceso a un control que se puede encontrar en diferentes páginas en diferentes tipos de contenedores, facilitando la programación en el cliente.
  • Predictable muy útil para controles con plantillas de repetición (item templates), como por ejemplo un Datalist o un Gridview.
  • Inherit el control heredará el modo que use su control padre.
  • AutoID el modo habitual como en cualquier versión de asp.net

Como hemos comentado esto se puede hacer a nivel de página

<%@ Page Language=”C#” AutoEventWireup=”true”
  CodeFile=”Default.aspx.cs”
  Inherits=”_Default”
  ClientIDMode=”Predictable” %>

o a nivel de web.config para todo el sitio

<system.web>
    <pages clientIDMode=Predictable>pages>
system.web>

Eso sí, cuidado de no generar IDs que no sean únicos. Ahora esto es nuestra responsabilidad si escogemos algunos de los modos que nos permiten controlar este aspecto.
Sería además una delicia que esto se pudiera hacer también con SharePoint 2010, que para customizarlo con jquery o similares ofrece a veces un acceso farragoso a los controles.

Saludos

12 July 2009

Escapar texto en formato QuotedPrintable - C#

Filed under: .NET — admin @ 16:35

Una pequeña función que hace uso de las expresiones regulares para escapar (transformar) texto en formato QP y evitar que estas cadenas salgan representadas en pantalla incorrectamente.

La función es muy sencilla:

public string EscapeText(string _textToEscape)
{

    if (!(String.IsNullOrEmpty(_textToEscape)))
    {

        Regex _regex = new Regex(”=[0-9|A-F][0-9|A-F]“);
        MatchCollection _matches = _regex.Matches(_textToEscape);
        foreach (Match _match in _matches)
        {
          int _asciiCode = int.Parse(_match.Value.Substring(1),
            System.Globalization.NumberStyles.HexNumber);
          _textToEscape = _textToEscape.Replace(_match.Value,
          Convert.ToString(Convert.ToChar(_asciiCode)));
         }

         _textToEscape = _textToEscape.Replace(”?=“, ““);
        _textToEscape = _textToEscape.Replace(”  “, “ “);

        return _textToEscape;

    }
    return string.Empty;

}   

Saludos.

13 May 2009

Ventajas y desventajas de asp.net mvc

Filed under: .NET, MVC, Asp.Net, Patterns — admin @ 8:41

Con las sucesivas versiones del MVC para asp.net que vienen apareciendo desde Octubre del 2007, el equipo de Scott Guthrie nos ofrece un framework que trasciende el modelo de eventos al que estamos acostumbrados, y nos ofrece varias ventajas nuevas, que para ser aprovechadas nos obliga a cambiar el modo de desarrollar habitual de asp.net.

No obstante, las ventajas son muchas:

  • Separación clara de dónde tiene que ir cada tipo de lógica (separation of concerns). Esto nos facilita el mantenimiento y la escalabilidad de la aplicación, además de facilitar el desarrollo en paralelo de las distintas partes o módulos.
  • Suporte al desarrollos por medio de metodología TDD por defecto (Test Driven Development). Por tanto facilidad para crear mock  tests y para poder correr los tests desde fuera del proceso de asp.net. Gran diferencia con respecto a como se tenían que hacer las pruebas anteriormente, o bien a mano, o bien con torpes y complejas macros para disparar eventos en la interfaz.
  • Arquitectura “pluggable” y extensible, en la que los componentes pueden ser aumentados o extendidos, algo que ya se podía hacer en las versiones anteriores de asp.net, pero que ahora va más allá. Ahora podemos usar inyectores de dependencia como Castle Windsor, Spring.net o Unity.
  • Motor de routing (asociación de una URL concreta con el controller correcto) para tener url más legibles, al estilo REST.
  • No hay ViewState ni ciclo de vida de las páginas. Menos peso, menos complejidad.
  • Control total del HTML generado. No tenemos controles que añaden su propio markup. Esto nos permite ademas integrar más fácilmente librerías como JQuery o MooTools, y olvidarnos de todo el código que asp.net inyecta para el mantenimiento del estado y el ViewState.

Conviene recordar que MVC no suplanta o elimina el desarrollo “tradicional” mediante webforms. Se trata simplemente de una alternativa que hay que sopesar según la situación y el tipo de proyecto. No olvidemos que asp.net webforms nos ofrece también un modelo de eventos familiar a todos los desarrolladores, mantenimiento del estado entre requests, numerosos controles de otros vendedores. No se trata de despreciar ahora este estupendo modelo de desarrollo.

Es necesario, por tanto, escoger el modelo en cada caso. Asp.Net MVC nos viene bien, o no, si queremos

  • Desarrollar según TDD.
  • Necesitamos controlar el HTML generado completamente.
  • Operaciones atómicas que no necesitan estado entre peticiones. Si la aplicación es muy orientada a datos y necesitamos estado, no es la opción adecuada.
  • Podemos prescindir de los eventos o sustituirlos mediante javascript y invocaciones web via ajax.
  • No es la opción adecuada si tenemos que usar controles ya generados o crear prototipos rápidos mediante drag & drop. Para eso, mejor webforms.

19 January 2009

Artículos interesantes de Pluralsight

Filed under: .NET, artículos — admin @ 12:28

La gente de Pluralsight, entre los que están expertos reconocidos como Aaron Skonnard, nos dejan hoy una serie de artículos introductorios pero interesantes, que podeis descargar aquí. Los artículos en cuestión son:

  • An Introduction to Microsoft .NET Services for Developers (Aaron Skonnard)
  • A Developer’s Guide to the Microsoft® .NET Access Control Service (Keith Brown)
  • A Developer’s Guide to the Microsoft® .NET Service Bus (Aaron Skonnard)
  • A Developer’s Guide to the Microsoft® .NET Workflow Service (Matt Milner)

Hay otro link de descarga directa aquí.

13 January 2009

¿Se puede cambiar el valor de una struct readonly?

Filed under: .NET, c# — admin @ 9:25

Si te enseñan el siguiente código, ¿cuál crees que es el resultado?

   1:  struct MutableStruct
   2:  {
   3:      private int x;
   4:      public int Mutate ( )
   5:      {
   6:          return ++x;
   7:      }
   8:  }
   9:  
  10:  class Program
  11:  {
  12:  public readonly MutableStruct _ms = new MutableStruct ();
  13:  static void Main ( string [] args )
  14:  {
  15:  Program _p = new Program ();
  16:  Console.WriteLine ( “Valor de la copia: {0} “,
  17:  _p._ms.Mutate ());
  18:  Console.WriteLine ( “Valor de la copia: {0} “,
  19:  _p._ms.Mutate () );
  20:  Console.WriteLine ( “Valor de la copia: {0} “,
  21:  _p._ms.Mutate ( ));
  22:  Console.ReadLine ();
  23:  }
  24:  }

El resultado puede sorprendernos a muchos. En realidad, no es 0, 0, 0 ni 1, 2, 3 sino 1,1,1. ¿Porqué? ¿cómo es eso? La cosa reside en la propia especificación del lenguaje C#. Recordemos que las struct son tipos de valor (value types), no referencias, es decir, son como un int y no como un objeto, como por ejemplo string. Por tanto, su valor no puede cambiar. Lo que ocurre es que al acceder a la struct en el código, obtenemos una copia de dicho valor, que no una referencia como ocurriría si accedieramos a un objeto, a una instancia de la clase “Producto”, por ejemplo, en nuestra aplicación. Es decir, que al hacer _p.ms estamos obteniendo una copia, y esa copia si es mutable, mientras que _m no lo es. Si modificamos el código ahora para comparar el valor original y la copia lo veremos más claro:

struct MutableStruct
{
private int x;
public int Mutate ( )
{
return ++x;
}
public override string ToString ( )
{
return String.Format ( “Valor de x: {0}”, x );
}

}

class Program
{
public readonly MutableStruct _ms = new MutableStruct ();
static void Main ( string [] args )
{
Program _p = new Program ();
Console.WriteLine ( “Valor de la copia: {0},{1}”,
_p._ms.Mutate (), _p._ms.ToString () );
Console.WriteLine ( “Valor de la copia: {0},{1}”,
_p._ms.Mutate (), _p._ms.ToString () );
Console.WriteLine ( “Valor de la copia: {0},{1}”,
_p._ms.Mutate ( ), _p._ms.ToString () );
Console.ReadLine ();
}
}

Al ejecutar veremos la siguiente salida por pantalla:

Valor de la copia: 1, Valor de x: 0
Valor de la copia: 1, Valor de x: 0
Valor de la copia: 1, Valor de x: 0

Esto nos permite ver que realmente lo único que cambia es el valor de la x interna de _p._ms, pero no cambia la variable asociada a ese campo, que sería la x privada que vemos en la definición de la struct.
Interesante ¿verdad?

Disclaimer: esto no se me ha ocurrido a mi, sino a Eric Lippert, pero me ha parecido muy interesante reproducirlo para trastear.

¿Y si le quitamos el readOnly?

Perdonad el formato, el editor es una puta mierda.

Saludos.

1 October 2008

Visual Studio 2010 y .NET Framework 4.0

Filed under: General, .NET — admin @ 11:56

Microsoft anuncia hoy que ya se puede echar un primer vistazo a lo que será Visual Studio 2010 y el runtime del .NET Framework 4.0, así como al producto Visual Studio Team System (VSTS) 2010 (antes tenía el codename Rosario).

Desde Agosto del año pasado, no obstamte, ya teniamos disponibles versiones CTP de Visual Studio Team System Code Name “Rosario”, distribuidas como viene siendo habitual en formato de imagen de Virtual PC.

Se siente la presión. Cuando apenas ha calado aún la versión 2008 en el entorno de muchos desarrolladores, ya tenemos esto en el horizonte. Y mientras, sigue habiendo muchos proyectos aún con VS2003 y BizTalk 2004.

El que quiera aprender algo más sobre “Rosario”, tiene este enlace (en inglés) para hacerlo. Los screenshots parecen auténticos teasers y tienen muy buena pinta.

Como novedad destacada, tendremos un entorno unificado de desarrollo y también de base de datos. Se incrementará el soporte para todo tipo de clientes, servicios, devices así como mejoras en la arquitectura interna y una mejor experiencia para el desarrollador. En fin, lo que siempre escuchamos cuando sale una nueva versión.

Os dejo un segundo enlace, esta vez en la lengua materna, para aprender algo nuevo y donde también están las imágenes VPC para probar esta herramienta.

Saludos

code on!!!

Next Page »