Visual Studio 2010 y .NET Framework 4

Octubre 30, 2009 :: Posted by - Emilio Torrens :: Category - , , , ,

VS2010_UI

Cada vez queda menos para que tengamos disponible la nueva versión de VS, junto con .NET Framework 4.0, C# 4.0, ASP.NET 4.0 etc, así que lo mejor es irse preparando, por ese motivo la gente de Microsoft lanza los “Kits de Entrenamientoâ€.

 Aquí podéis encontrar el ultimo, de Octubre, en el encontraremos, presentaciones, demos y ejemplos de:

C# 4.0, Visual Basic 10, F#, Parallel Extensions, Windows Communication Foundation, Windows Workflow,Windows Presentation Foundation, ASP.NET 4, Windows 7, Entity Framework,ADO.NET Data Services, Managed Extensibility Framework y Visual Studio Team System.

Así que no falta de nada :)

Soap Extension

Octubre 07, 2009 :: Posted by - JordiC :: Category - , , ,

Soap Extension es un mecanismo de ASP.NET para interceptar mensages Soap cuando entran o salen de nuestro sistema. Existen cuatro puntos en todo el proceso del mensaje en los cuales podremos interceptar el mensaje:

esw638yk_xmlwebservicelifetime(en-us,VS_71)

Para implementarla solo tenemos que crear una clase que herede de System.Web.Services.Protocols.SoapExtension. Aquí tienes un ejemplo sacado de la documentación de MSDN, intercepta los mensajes en la entrada duespues de serializar (Paso 2 en el gráfico) y en la salida antes de Deserializar (Paso 4 en el gráfico) y guarda los mensajes en disco.

public class TraceExtension : SoapExtension
{

    Stream oldStream;
    Stream newStream;
    string filename;

    // Save the Stream representing the SOAP request or SOAP response into
    // a local memory buffer.
    public override Stream ChainStream( Stream stream ){
        oldStream = stream;
        newStream = new MemoryStream();
        return newStream;
    }

    // When the SOAP extension is accessed for the first time, the XML Web
    // service method it is applied to is accessed to store the file
    // name passed in, using the corresponding SoapExtensionAttribute.
    public override object GetInitializer(LogicalMethodInfo methodInfo,
	                                   SoapExtensionAttribute attribute)
    {
        return ((TraceExtensionAttribute) attribute).Filename;
    }

    // The SOAP extension was configured to run using a configuration file
    // instead of an attribute applied to a specific XML Web service
    // method.
    public override object GetInitializer(Type WebServiceType)
    {
      // Return a file name to log the trace information to, based on the
      // type.
      return "C:\\" + WebServiceType.FullName + ".log";
    }

    // Receive the file name stored by GetInitializer and store it in a
    // member variable for this specific instance.
    public override void Initialize(object initializer)
    {
        filename = (string) initializer;
    }

    //  If the SoapMessageStage is such that the SoapRequest or
    //  SoapResponse is still in the SOAP format to be sent or received,
    //  save it out to a file.
    public override void ProcessMessage(SoapMessage message)
    {
        switch (message.Stage) {
        case SoapMessageStage.BeforeSerialize:
            break;
        case SoapMessageStage.AfterSerialize:
            WriteOutput(message);
            break;
        case SoapMessageStage.BeforeDeserialize:
            WriteInput(message);
            break;
        case SoapMessageStage.AfterDeserialize:
            break;
        default:
             throw new Exception("invalid stage");
        }
    }

    public void WriteOutput(SoapMessage message){
        newStream.Position = 0;
        FileStream fs = new FileStream(filename, FileMode.Append,
                                       FileAccess.Write);
        StreamWriter w = new StreamWriter(fs);

        string soapString =
          (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest";
        w.WriteLine("-----" + soapString + " at " + DateTime.Now);
        w.Flush();
        Copy(newStream, fs);
        w.Close();
        newStream.Position = 0;
        Copy(newStream, oldStream);
    }

    public void WriteInput(SoapMessage message){
        Copy(oldStream, newStream);
        FileStream fs = new FileStream(filename, FileMode.Append,
                                       FileAccess.Write);
        StreamWriter w = new StreamWriter(fs);

        string soapString = (message is SoapServerMessage) ?
                            "SoapRequest" : "SoapResponse";
        w.WriteLine("-----" + soapString +
                    " at " + DateTime.Now);
        w.Flush();
        newStream.Position = 0;
        Copy(newStream, fs);
        w.Close();
        newStream.Position = 0;
    }

    void Copy(Stream from, Stream to)
    {
        TextReader reader = new StreamReader(from);
        TextWriter writer = new StreamWriter(to);
        writer.WriteLine(reader.ReadToEnd());
        writer.Flush();
    }
  }
}

 

Para poder insertar la SoapExtension en la entrada y salida de un WebMethod hay que crear una clase que herede de SoapExtensionAttribute cuya propiedad ExtensionType le dice al framework que clase SoapExtension utilizar. También tiene una propiedad Priority para que en caso de que haya más de un SoapExtension el sistema sepa en que orden ejecutarlas:

  // Create a SoapExtensionAttribute for the SOAP Extension that can be
  // applied to an XML Web service method.
 [AttributeUsage(AttributeTargets.Method)]
 public class TraceExtensionAttribute : SoapExtensionAttribute {

   private string filename = "c:\\log.txt";
   private int priority;

   public override Type ExtensionType {
       get { return typeof(TraceExtension); }
   }

   public override int Priority {
       get { return priority; }
       set { priority = value; }
   }

   public string Filename {
       get {
           return filename;
       }
       set {
           filename = value;
       }
   }

Para que un WebMethod utilice la SoapExtension solo queda aplicar el SoapExtensionAttribute al método:

 

[WebMethod]
[TraceExtension()]
public string MetodoWeb(string str)
{
    return "Hola";
}

 

 

Aplicaciones ASP.NET a Producción

Mayo 07, 2009 :: Posted by - Emilio Torrens :: Category - ,

Desde que hacer deploy de una aplicación ASP.NET no es mas que copiar en local y pegar en el servidor, la tarea de pasar las aplicaciones a producción la suele llevar a cabo el mismo programador, los programadores no estamos hecho para eso y muchas veces olvidamos detalles … :)

Cuando pasamos una aplicación ASP.NET a Producción, el fallo mas tonto y el mas habitual que cometemos es no modificar los valores del fichero web.config que hacen que la aplicación corra en modo depuración, eso hace que nuestra aplicación sea lenta como una tortuga :)

Hay un truco para tener el servidor de producción configurado de manera que cualquier aplicación ASP.NET que se instale no corra en modo depuración, esto se consigue modificando el machine.config del servidor (C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG) de la siguiente manera:

<configuration>
    <system.web>
          <deployment retail=â€trueâ€/>
    </system.web>
</configuration>

Con esta configuración el servidor, al ejecutar las aplicaciones ASP.NET, no tendrá en cuenta los valores debug, trace y enableCustomErrors del archivo de configuración de la aplicación y se ejecutara siempre con estos valores:

· debug=false

· trace=false

· enableCustomErrors=RemoteOnly

Como debe ser en producción :)

Web.config y configSource

Noviembre 21, 2008 :: Posted by - Emilio Torrens :: Category -

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.

Microsoft incluirá JQuery en la nueva versión de Visual Studio

Septiembre 29, 2008 :: Posted by - Emilio Torrens :: Category - , ,

JQuery la librería de desarrollo web Javascript será incluida "de fábrica" en la siguiente versión de Visual Studio, aunque de momento ya lo hará con ASP.NET MVC. Además Microsoft contribuirá con tests, arreglos de bugs y parches.

image

Para los que no lo conozcan JQuery permite seleccionar y manipular elementos HTML con poquísimas líneas de código.

Aquí tenéis unos ejemplos de como JQuery se integra perfectamente con ASP.NET AJAX.

VS 2008 Web Development Hot-Fix

Febrero 11, 2008 :: Posted by - Emilio Torrens :: Category - ,

Microsoft ha publicado un nuevo hot-fix para vs 2008 que arregla varios bugs en proyectos Web. La lista de problemas que arregla la tenéis aquí.

VS 2008 Web Development Hot-Fix

Microsoft ASP.NET 3.5 Extensions Preview

Diciembre 12, 2007 :: Posted by - Emilio Torrens :: Category -

Han publicado en ASP.NET las Microsoft ASP.NET 3.5 Extensions Preview

En la versión cabe destacar la inclusión del MVC, El Entity Framework, los Data Services y algunos controles para SilverLight

Ejecutar los métodos de nuestro WebForm ASP.NET desde la parte Cliente con Java Script

Noviembre 12, 2007 :: Posted by - Emilio Torrens :: Category -

Podemos ejecutar los métodos que tenemos definidos en el código de nuestro webform desde la parte cliente, los pasos a seguir son:

1- Añadir un Script Manager e indicarle que los PageMethods están activos:

<asp:ScriptManager ID="ScriptManager1"
 runat="server"  EnablePageMethods="true"/>

2-El Método que queremos ejecutar tiene que ser estático y estar marcado con el atributo [WebMethod]

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    [WebMethod]
    public static string GetHello(string Name)
    {
        return "Hello " + Name;
    }
}

3- Creamos las funciones en Javascript, la estructura sera PageMethods.NombreDelMetodo y recibe como parametros los del metodo mas los manejadores

<script  type="text/javascript" language="javascript">
 function ClientGetHello(){
   PageMethods.GetHello($get("TextBox1").value,
    onCallbackComplete,
    onCallbackError,
    onCallbackError);
}

 function onCallbackComplete(result){
     alert(result);
}

 function onCallbackError(){
     alert('Se ha producido un Error');
}
</script>

4-Ya podemos usar ese método desde la parte cliente

<div id="MyDiv">
     <input id="Button1" type="button" value="button"
  onclick="JavaScript:ClientGetHello();"/>
     <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
 </div>

ASP.NET Servicios Web y CacheDuration (de paso como activar POST y GET en nuestros servicios web)

Noviembre 08, 2007 :: Posted by - Emilio Torrens :: Category - ,

CacheDuration es un atributo de WebMethod con el que podemos implementar de manera muy sencilla un sistema de chache basado en el tiempo, cuando le indicamos la duración del Cache (en segundos) el servidor guarda los parámetros del request y la respuesta, así mientras no caduque el cache para parámetros iguales el código de nuestro método no se ejecutara y devolverá el resultado desde el cache.

Podéis probar con este código, la primera vez tardara 5 segundos, pero durante el siguiente minuto, para el mismo Texto, será instantáneo:

WebMethod(CacheDuration=60)]
 public int CountChars(string Text)
 {
     System.Threading.Thread.Sleep(5000);
     return String.IsNullOrEmpty(Text) ? 0 : Text.Length;
 }

Ojo que las peticiones vía POST no se guardan en el cache y la pagina de pruebas de los servicios web funciona con POST, así que debes probarlo o bien por SOAP o bien por GET.

Por defecto los servicios web llevan el GET y el POST desactivado, para activarlos solo tenéis que añadir esto dentro de <system.web> en el Web.config:

<webServices>
   <protocols>
      <add name="HttpGet"/>
      <add name="HttpPost"/>
   </protocols>
</webServices>

Cache en ASP.NET

Octubre 17, 2007 :: Posted by - Emilio Torrens :: Category -

7Steven Smith, presidente de ASP alliance nos enseña las diferentes formas de cacheo en ASP.NET con un video publicado en dnrTV.