JUTI XI – Presentación: ASP.NET MVC 2 con Entity Framework 4.0 en VS2010

Hace un par de semanas estuvimos con Cristina presentando en la JUTI algunas características de Entity Framework 4.0 y ASP.NET MVC 2 con Visual Studio 2010. Aquí va el post (que lo tenia en borrador) y la presentación que nos recordó Noelia que no la publicamos aún (así que aquí esta lo que debíamos)

Esto ya nos comento Diego, que presentó con Lautaro y el invitado especial Rodrigo Eirasca (de CGE Consultores de Gestión Empresaria),  el tema Certificar Calidad bajo ISO 9001:2008

Este es el 11° año de la JUTI (Jornadas Universitarias Tecnológicas sobre Informática) que se viene realizando en la UTN-FRRE (que este año esta de cincuentenario)

http://www.juti-frre.com.ar/
NOTA: Lástima que la web de la JUTI la utilicen para otros eventos, seria bueno tener un enlace “histórico” para no perder todas las versiones anteriores 🙁

Aquí les dejo el enlace a la presentación, y de paso la pruebo la incrustación directa 🙂

[ASP.NET] Vulnerabilidad de Seguridad (Todas las versiones)

[Actualización 28/09/2010] FINAL
Actualización de seguridad Microsoft Security Bulletin MS10-070 – Important Asi que a descargar…. Primeramente mediante Microsoft Download Center (forma manual), o puedes (si quieres) esperar unos días  y estará entre nosotros por Windows Update /Windows Server Update Service.

[Actualización 24/09/2010]
Se actualizo la solución provisoria en el aviso de seguridad Microsoft Security Advisory (2416728) para agregar un filtro mas de “protección” para este caso especifico que lee los mensajes de error de nuestra aplicación. La idea es implementar el filtro de URL para no permitir peticiones con “aspxerrorpath=” en el IIS, aquí podremos utilizar Request Filtering o URLScan (leer mas abajo la Tarea 2)

[Actualización 21/09/2010]
Doy enlace a un post de Sergio Tarrillo donde da un timeline de los últimos días y un ejemplo de aplicar la solución provisional: Reciente vulnerabilidad de ASP.NET y BlogEngine.Net

[Actualización 20/09/2010]
Doy enlace al post de Alberto Diaz donde aplica la solución provisional en SP 2010: SharePoint 2010. Vulnerabilidad 0 days de ASP.NET.
Donde en los comentarios nos da el enlace al blog de Sharepoint: Security Advisory 2416728 (Vulnerability in ASP.NET) and SharePoint.

[Actualización 19/09/2010]
Doy enlace a un post de David Salgado donde da su punto de vista (el cual comparto): El 0 day de asp.net… modo de evitarlo? y referencias 

 

Mas de uno ya se habrá enterado pero ayer se presento en una conferencia esta vulnerabilidad (ekoparty), yo por mi parte lo encontré por un comentario de un amigo en el trabajo cuando hace dos días me envió un articulo, así que lo venia siguiendo.

Que me llevo ver los resultados de la Conferencia de Seguridad ekoparty http://www.ekoparty.org/ que presentaron el tema

La vulnerabilidad fue publicada luego de presentarse:

Y como lo comenta Scott Guthrie… , It’s important (el tiene su blog mas información). También publicó unas preguntas frecuentes

Cuando se publica la vulnerabilidad tenemos unas “soluciones de compromiso/provisionales” y también unas herramientas para que los responsables de infraestructura pueda escudriñar los sitios del IIS de un server y detectar posibles configuraciones débiles

Problema

Ayer a la tarde en la conferencia se expuso una vulnerabilidad de ASP.NET para todas las versiones de ASP.NET(desde la 1.1 a la 4.0) para todos los sistemas operativos:

“Un atacante que aprovechara esta vulnerabilidad podría ver los datos, como el estado de vista, que fue cifrado por el servidor de destino, o leer datos de archivos en el servidor de destino, como el web.config…”

Como hablamos con Lautaro, si el web.config encima tiene datos sensibles (acuérdense que se puede encriptar la cadena de conexión) estamos en graves problemas.

Mas Técnico:

 


Solución (provisional)

[Actualización 28/09/2010] FINAL
Ya esta la solución final (un parche de seguridad) leer aquí Microsoft Security Bulletin MS10-070 – Important
No es necesario aplicar las “soluciones provisionales” una vez aplicado la solución final

A las horas… se publicó “la contra oferta”, (para salir del paso como se diría) básicamente es:

“Habilitar los errores ASP.NET personalizado y mapear todos los códigos de error a la misma pagina de error”

Pero también utilizar una página de error “con un poco de código” (miren el enlace de Secuity Advisor) donde establece un timeout

Dos tareas a realizar “provisionalmente” para nuestra protección [Actualización 24/09/2010]

  1. [En la App Web] Habilitar los errores ASP.NET personalizado y mapear todos los códigos de error a la misma pagina de error (independientemente del error detectado)
  2. [En el Servidor IIS] Bloqueo de los request que especifican la ruta de error. Es decir no permitir “aspxerrorpath=” en el querystring

 

La solución final se desplegara mediante Windows Update, así que a estar atentos. Cuando vea la luz la solución final, estos “filtros de protección” ya no lo debemos aplicar.

TAREA 1: Habilitar los errores ASP.NET personalizado y mapear todos los códigos de error a la misma pagina de error

 

Ejemplos:

  • ASP.NET 3.5 o anterior…
    <location allowOverride="false">
       <system.web>
         <customErrors mode="On" defaultRedirect="~/error.html" />
       </system.web>
    </location>

  • En ASP.NET 3.5 SP1 o superior (NET 4.0)
    <location allowOverride="false">
       <system.web>
         <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/ErrorPage.aspx" />
       </system.web>
    </location>

Como comenta Scott en su blog, también es recomendable un “delay” en la pagina de error

Ejemplo:

<script runat="server">
   void Page_Load() {
      byte[] delay = new byte[1];
      RandomNumberGenerator prng = new RNGCryptoServiceProvider();

      prng.GetBytes(delay);
      Thread.Sleep((int)delay[0]);
        
      IDisposable disposable = prng as IDisposable;
      if (disposable != null) { disposable.Dispose(); }
    }
</script>

 

TAREA 2: Bloqueo de los request que especifican la ruta de error (aspxerrorpath)

Aquí tenemos dos alternativas,

Opcion A) Request filtering

Si estamos en Windows Vista Service Pack 2, Windows Server 2008 Service Pack 2, Windows 7, Windows Server 2008 R2.

Podremos utilizar un característica del IIS 7 Request Filtering

Windows 7 Windows 2008
Activando una característica…

image
Agregando un rol…

image

Una vez instalado debemos ir a denegar: aspxerrorpath=

Por linea de comando utilizando AppCmd

     appcmd set config /section:requestfiltering /+denyQueryStringSequences.[sequence=’aspxerrorpath=’]

Opcion B) URLScan

Aqui utilizaremos URLScan para filtrar las peticiones en nuestros IIS (versiones 5.1/6/7)

Hay que modificar la el archivo UrlScan.ini (%windir%system32inetsrvurlscan) y en la linea bajo [DenyQueryStringSequences] agregar:

aspxerrorpath=

Nos quedaría:

[DenyQueryStringSequences]

aspxerrorpath=

 

 

Herramienta (Script) para detectar las aplicaciones vulnerables

Para comenzar a fixear, ejecute la herramienta (es un script) que nos informa en un servidor ”las web con la vulnerabilidad a flor de pecho”, que los responsables de infraestructura pueden ejecutar en un server y verificar todas las web del IIS.

 

 

Espero que les sirva de ayuda o guía,… o a modo informativo.

 

 

Enlaces

[VS2010] Enfocarnos en “solo un” Área de ASP.NET MVC como raíz en VS2010 gracias a las Productivity Power Tools

Trabajando con ASP.NET MVC y Áreas, en un proyecto con múltiples Áreas, es conveniente para “enfocar el cerebro” tener en el explorador de soluciones solo los controladores y vistas del área en que estamos trabajando.

Me ayude de las extensiones de  Visual Studio 2010 Productivity Power Tools, tiene una funcionalidad que es el “Navegador de Solucion” (Solution Navigator) que es una herramienta/funcionalidad All-In-One … “unión entre el explorador de soluciones, el de objetos, buscador… etc“ que nos brinda una serie de ricas funciones.

Ya nos comentaba Jersson:

Para empezar a utilizarlo…

image

Una de estas funciones: Crear una vista a partir de un elemento (nodo/carpeta) 

En cada elemento del navegador de soluciones tenemos un botón contextual “View this as root”

image 

Lo cual me crea un filtro en mi árbol del navegador de solución, con la raíz en el elemento que seleccionamos para “concentrarme” en el Área especifica

image

NOTA: Se puede hacer desde cualquier elemento 😉

Y hasta la búsqueda es contextual al “ámbito de la raíz que definimos”

image

 

Espero que les pueda ayudar como a mi.

 

 

Mas info

[Formación] Workshop Scrum… UTN-FRRE Agosto/2010. Finalizado

La semana pasada con Diego tuvimos nuevamente la grata responsabilidad de facilitar un taller sobre Scrum, el segundo de los workshop planificados en el marco del proyecto de extensión: “Formación de RRHH orientados al desarrollo de la industria del software de la región NEA” (programa La Universidad en el Medio).

Esta vez participaron docentes de la carrera de Sistemas de la UTN-FRRE y profesionales del Polo IT Chaco.

Presentamos el framework de trabajo pero nos llevamos como siempre un rico intercambio de experiencias.

20100821-WorkshopScrumUTN (21)

… aquí nuevamente faltan algunos participantes por tenían que retirarse un poco antes de la “foto del recuerdo”

20100821-WorkshopScrumUTN (1) 20100821-WorkshopScrumUTN (3)20100821-WorkshopScrumUTN (7) 

Mas imágenes aquí

[ASP.NET] Nuevos snippet de código en VS2010 para HTML, Javascript … y sumando para jQuery

Cuando trabajamos en ambientes web con Visual Studio 2010 tenemos a nuestra disposición los nuevos snippet de código para HTML y Javascript algo que nos puede ayudar en nuestro día a día (además de los que ya teníamos ASP.NET y sus webcontrols de versiones previas y por supuesto de ASP.NET MVC 2).

En estos días estamos en la empresa “aumentando” nuestra formación en jQuery así que saque a relucir algo que tenia en borrador desde hace un par de meses por los snippets para este framework javascript.

O sea tenemos del lado del cliente snippets:

    1. Snippet “out-the-box” para HTML (lo que viene con VS2010)
    2. Snippet “out-the-box” para Javascript (lo que viene con VS2010)
    3. Snippet para jQuery (no viene preinstalado, aquí hay que crear al snippet … o mejor si alguien ya lo hizo y lo compartió… menos doloroso)

 

1 – Snippet para HTML

Esto lo tenemos disponible “out-the-box” (o sea preinstalado) para acortarnos camino al escribir una tag a o table… incluso para silverlight 😉

Etiqueta/Snippet para HTML Snippet generado
image  image
Asi tenemos desde los “básicos” como div, table, span, etc…. image
Como algo completo (y doloroso para escribirlo o copiarlo) como es el tag object para insertar Silverlight

NOTA: En breve veremos como hacer uno para swfObject para insertar películas Flash

image

Listado Completo: Si quieres tener un listado John Sheehan (@johnsheehan) (el que armo y compartió los snippet de jQuery) tiene un “cheat sheets” de estos snippets

 

Inserción de un Snippet

Existen tres formas de disparar la inserción de un snippet

  1. La primera escribiendo el “código” del snippet (en vista del código fuente del marcado html) y luego presionando [Tab]
    (No es lo mismo que los snippet de webcontrol donde hay que presionar dos veces Tab para que complete el nombre del control y luego que escriba el snippet)
  2. La segunda mas “grafica” con el famoso menú contextual (botón derecho)
    image
  3. También con las “hot-key” presionando Ctrl+K, Ctrl+X (en ese secuencia) y aparece el selector para “Insert Snippet”…
    image

 

Envolver nuestro código con… en el editor HTML

También tenemos posibilidad de insertar y/o envolver nuestro código (como lo hacemos en el codebehind) pero en el editor HTML, ya nos comenta elBruno

 

Donde está la configuración de snippet?

Tools >> Code Snippets Manager (Ctrl+K, Ctrl+B)

image

 

Crear un Snippet, “encapsulando conocimiento”

Si quieres crear uno propio puedes escribirlo en XML (si te gusta martirizar con abrir y cerrar tags) o utilizar

En todos los casos se debe copiar el archivo miSnippet.snippet

C:Users{usuario}DocumentsVisual Studio 2010Code SnippetsVisual Web Developer

Alli tienes dos carpetas My HTML Snippets y My JSScript Snippets respectivamente

image

NOTA: Ahora que recuerdo, tengo un post relacionado “tipo tutorial” para crear un snippet para insertar peliculas flash con  swfobject, así que lo publicare en breve.

 

 

2 – Snippet para Javascript

Tenemos también “out-the-box” snippet para Javascript (lo justo y necesario)

image

Ejemplos:

Etiqueta/Snippet para JS Snippet generado
image   image
image image

 

 

 

3 – Snippet para jQuery

Aquí hacemos uso de jQuery Code Snippets for Visual Studio 2010 que es proyecto hosteado en CodePlex que nos agrega unos cuantos snippet. O sea o lo hacemos nosotros o utilizamos lo que alguien compartió (y nos ahorro un par de horas) esto gracias John Sheehan (@johnsheehan)

Para ayudarnos en vez del copy&paste nos da un instalador y copia en las carpetas para snippets personalizados que comente mas arriba (My HTML Snippets y My JSScript Snippets)
image

Entonces luego podremos ver que nos instalo unos cuentos

Snippet para jQuery en HTML Snippet para jQuery en JScript
image image

NOTA: (para el quisquilloso) La versión que nos inserta para la registración de la libreria jQuery es para la 1.3.2, para tenerlo en cuenta. Tampoco creo que cambiar 1.3.2 a 1.4.2 que es la ultima sea muy difícil. Por ejemplo abriendo todos los archivos con Notepad++ y reemplazando valores.
O también te vas a la ultima revisión de código y te descargas el repositorio y reemplazas archivos.

 

Ejemplos:

Etiqueta/Snippet para jQuery Snippet generado
  image image
los CDN tanto de Google como Microsoft
 image
image
… el $(document).ready…

image
image
   

Listado completo de Snippet para jQuery aquí

Video de uso :

http://www.screencast.com/users/JohnSheehan/folders/Jing/media/e0787da7-5e1c-4eef-bbb9-648426204be5

 

[Actualización 27/08/2010]

Leyendo el blog @Jersson di con un post interesante referente a tips en la utilización de los fragmentos de código, dejo (y linkeo) el enlace

 

 

 

Enlaces:

[ASP.NET] Error: Could not load file or assembly [XXX] The parameter is incorrect … HRESULT: 0x80070057 (E_INVALIDARG). Solución

Esos errores que aparecen en tu vida y vaya a saber que planetas se alinearon…

En una aplicación web con ASP.NET 3.5/VS2008 en una de las maquinas de desarrollo dio este mensaje de error el momento de debugear

Mensaje de Error:

Could not load file or assembly ‘…’ or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))

Y para “colmo de males” el mensaje directamente era por el assembly de AJAX Control Toolkit

Could not load file or assembly ‘AjaxControlToolkit’ or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))

Solución efectiva y eficaz (al estilo del botón reset)

Con Diego dimos en la solución eliminando la carpeta temporal de Temporal de Archivos de ASP.NET que es donde “la magia” de la compilación dinámica genera sus archivos

Esta carpeta generalmente se encuentra aquí:

%SystemRoot%Microsoft.NETFrameworkversionNumberTemporary ASP.NET Files

Como estamos trabajando con ASP.NET 3.5 en core del framework es 2.0 así que la carpeta específicamente se encuentra aquí:

C:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files

NOTA IMPORTANTE: Desarrollando en Vista/Windows 7

Justamente en la maquina donde generaba el error es un Windows 7, y si utilizamos un usuario que no es administrador local de la maquina la carpeta temporal se “redirecciona” aquí

%LocalAppData%TempTemporary ASP.NET Files

Ejemplo:

c:Users[Usuario]AppDataLocalTempTemporary ASP.NET Files 

 


Espero que les pueda servir de ayuda o guía…

[Formación] Workshop Scrum… UNNE Jun/2010. Finalizado.

Se realizó la semana pasada el primero de los dos workshop sobre Scrum como ya había comentado, para acercarlo y poder “sentirlo” (vivenciarlo)

Esta vez participaron en su mayoría docentes de la carrera de Licenciatura en Sistemas de la UNNE – FACENA, pero también asistieron profesionales del Polo IT Corrientes y Polo IT Chaco.

Con Diego comunicamos de diferentes maneras (con dinámicas de grupo, dibujando, explicando, moviéndonos, con gráficos, y escribiendo) dejando de lado un poco “la clase magistral”

  SDC13662
…aquí en la foto nos faltan dos personas 🙁

A medida que transcurrían la horas nos íbamos compenetrando e intercambiábamos tanto experiencias como compresión en los diferentes roles, artefactos y momentos que nos propone Scrum.

Y al final realizamos algo vivencial, sentir y “sufrir” lo que veníamos hablando… Practicar Scrum.

Aquí tengo que agradecer a Alan Cyment por facilitarme la dinámica del pajarraco (ya hace un par de meses para otro workshop) para realizar la simulación completa de Scrum, además con Diego hicimos unos retoques.

SDC13654SDC13659 SDC13657  SDC13652

 

Aquí un par de imágenes mas…. del proceso 😉

Mas imágenes aquí

Quisiéramos agradecer a Cristina Liliam Greiner y Laly Dapozo (ambas de la UNNE) por la gestión para realizar todo esto.

Ahora se viene el segundo workshop en la UTN FRRE…

[Formación] Workshop Scrum. UNNE/UTN FRRe (Jun/Jul 2010). Cupos Limitados

Nuevamente tengo la oportunidad junto con Diego Morales, de facilitar un workshop de Scrum, en marco del proyecto de extensión: “Formación de RRHH orientados al desarrollo de la industria del software de la region NEA” (programa La Universidad en el Medio).

La ultima vez que hicimos en un curso de Scrum publico fue en la JUTI 2009 (…allí tuvimos 6 horas apretadas y ahora tenemos un poco mas) Algunas repercusiones de esa vez:

Este vez estaremos dictando este curso de capacitación y taller destinado “preferencialmente” para profesionales de empresas de los polos tecnológicos del Chaco (Polo IT Chaco) y de Corrientes (Polo IT Corrientes), docentes de carreras informáticas/sistemas de la UNNE y le UTN FRRe., alumnos avanzados; pero también invitamos a toda persona que desea darle una mirada y un acercamiento a Scrum.

…desde hace unos meses en reuniones con responsables de formación de ambos Polos IT (Chaco/Corrientes) y de responsables de ambas instituciones (UNNE / UTN FRRe), se llego a un convenio de una serie de cursos de formación desde las instituciones hacia las empresas y desde las empresas hacia las instituciones; todo esto para crear una relación un poco mas simbiótica (estrecha y persistente) entre todas las partes que mas que una simple “fabrica y tomador de rrhh” 😉

Mas datos del workshop

Lugar:
FACENA (Facultad de Ciencias Exactas y Naturales y Agrimensura) de la UNNE | 9 de Julio 1449 (Corrientes)

Cronograma:
Se dictaran en dos grupos, el primero el próximo 25 y 26 de Junio de 2010 y el siguiente el 2 y 3 de Julio de 2010

Inscripción e Informes (y costos):
Secretaria del Departamento de Informática de FACENA (Facultad de Ciencias Exactas y Naturales y Agrimensura) de la UNNE
9 de Julio 1449 (Corrientes) | 1er. Piso | de 14 a 21hs (María Laura)
Email: gndapozo @exa.unne.edu.ar, cgreiner @exa.unne.edu.ar

 

Bueno si mas introducciones aquí les dejo el afiche del curso:

UNNE-2010-Scrum

[Entity Framework] Serializar entidades con JSON.NET – Error: The type ‘EntidadXXX’ cannot be serialized to JSON because its IsReference setting is ‘True’

En el trabajo cotidiano estaba armando un servicio WCF que genera JSON a partir de entidades de Entity Framework, cuando la simplicidad me genero un error. Simplicidad porque no quería mas que un listado de una de mis entidades en formato JSON

Estaba utilizando DataContractJsonSerializer como siempre en mis app web, pero parece que tiene un problema con EF 1.0:

Como bien dice “reza” este articulo: Serializing Entity Framework object to JSON

“…serializing EF object to JSON is not quite of an easy task…”

Lo bueno que encontré la solución utilizando la librería JSON.NET

Json.NET library makes working with JSON formatted data in .NET simple. Key features include a flexible JSON serializer to for quickly converting .NET classes to JSON and back again, and LINQ to JSON for reading and writing JSON.

 

Mensaje de Horror Error:

[EN]

"The type ‘EntidadXXX’ cannot be serialized to JSON because its IsReference setting is ‘True’. The JSON format does not support references because there is no standardized format for representing references. To enable serialization, disable the IsReference setting on the type or an appropriate parent class of the type."

[ES]

"El tipo ‘EntidadXXX’ no se puede serializar a JSON porque su valor IsReference es ‘True’. El formato JSON no admite referencias porque no hay un formato estandarizado para representarlas. Para habilitar la serialización, deshabilite el valor IsReference en el tipo o en una clase primaria apropiada del tipo."

image

 

 

Aquí va el ejemplo

El código que genera la excepción antes mencionada

public string ListadoJSON(){
            string cadenaJSON = string.Empty;
            ItemRepository itemRepositorio = new ItemRepository();
            Int32 paginaPageTotal;
            List<Item> listado = itemRepositorio.Buscar("", 0, 0, 17, 10, 1, out paginaPageTotal);

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<Item>));
            using (MemoryStream ms = new MemoryStream())
            {
                ser.WriteObject(ms, listado);
                cadenaJSON = Encoding.Default.GetString(ms.ToArray());
            }

            return cadenaJSON;
}

Esto genera un error al momento de serializar

OPCION 1:Crear un listado para serializar con objetos anónimos

Como no puede serializar la entidad entonces generamos un nuevo listado con las propiedades que queremos serializar

ArrayList listadoItemsParaSerializar = new ArrayList();
foreach (var item in listado)
{
    var itemNuevo = new { id = item.ItemId, nombre=item.Nombre};
    listadoItemsParaSerializar.Add(itemNuevo);
}

Y luego serializamos con DataContractJsonSerializer el nuevo listado: listadoItemsParaSerializar 😉

 

OPCION 2: sin crear nada utilizando la librería JSON.NET

Utilizando JSON.NET solucionando el problema

public string ListadoJSONConJSONDotNET(){
            string cadenaJSON = string.Empty;
            ItemRepository itemRepositorio = new ItemRepository();
            Int32 paginaPageTotal;
            List<Item> listado = itemRepositorio.Buscar("", 0, 0, 17, 10, 1, out paginaPageTotal);

            cadenaJSON = Newtonsoft.Json.JsonConvert.SerializeObject(listado, Newtonsoft.Json.Formatting.Indented);

            return cadenaJSON;
        
}

 

Es la forma mas simple, pero la librería tiene varios convertidores, me gusto del Datatable que tengo por ahí algunos para consultas “cuadradas” para reportes o gráficos y el de JavaScriptDateTimeConverter . Mas info en la ayuda online

 

Espero que les sirva de ayuda o guía.

 

Enlaces

[Silverlight] Pasar proyecto de VS2008 > VS2010 > VS2008, y el mensaje: Cannot get the list of output files from the project

Si probaste la beta, RC y ahora el trial y/o versión final de VS2010 con proyectos en curso de Silverlight desarrollados con VS2008 podrás tener el inconveniente que encontré al abrir proyecto SL con VS2010 y luego querer abrir nuevamente con VS2008.
Si bien el archivo de solución cambia (no es el mismo que VS2008), creía que el archivo de proyecto mantendría cierta consistencia pero no es así.
Esto solamente sucedió en proyectos SL, porque en otros proyectos (web app, consola) al abrir con diferentes versiones del Visual Studio daba el mensaje y podía seguir utilizandolo, pero en SL no me dejaba seguir trabajando (no es un error, pero no te deja utilizarlo 😉 )

Mensaje de “warning” al compilar:
Project file contains ToolsVersion="4.0", which is not supported by this version of MSBuild. Treating the project as if it had ToolsVersion="3.5".

image

El mensaje que no dejaba utilizar el proyecto Silverlight:
Cannot get the list of output files from the project

image

Solución express (rápida)

Abrir el archivo de proyecto (con algún editor de texto plano) y cambiar la línea que dice <Project ToolsVersion=”4.0”

image 
Por <Project ToolsVersion=”3.5”

image

y ya podremos seguir utilizando el proyecto en VS2008