Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET

En el proyecto en el que me encuentro, tenemos desarrollada una librería .NET para obtener informes en Excel mediante la llamada a una BAPI de SAP. Esta librería trabaja con el objeto COM de Excel y al mismo tiempo es consumida desde ASP.NET, sí, ya sé que Microsoft no recomienda el uso de componentes Office en aplicaciones ASP.NET, «COM Interop with Microsoft Office products from an ASP.NET web page. Excel was not designed to be used inthis way» pero esto es un caso de fuerza mayor y no hay más narices, puesto que son informes bastantes complejos que no basta con utilizar un DataGrid y renderizar su contenido y lanzar una salida con Response.Write y poner el Response.ContentType = «application/vnd.ms-excel, como tantos ejemplos hay por ahí.

El problema con el que me he encontrado es el siguiente:

Todas las pruebas realizadas han funcionado a la perfección en las máquinas de desarrollo (Eso de ser Administrador de máquina…) pero… cuando lo he montado en el servidor de pruebas y he hecho la primera petición de un informe me he encontrado con esto:

Acceso Denegado

Empezamos bien. La primera conclusión es evidente: Falta de Permisos, así que le he arrancado el Debugger de mi máquina y le he pedido a mi compañero que hiciera una petición de informe para ver donde casca:

ApplicationClass objExcel = new ApplicationClass();

Le he dado permisos de Administrador a mi compañero en mi máquina, ha vuelto a ejecutar la petición y ¡Vualá! todo funciona, porque estas llamadas a objetos COM necesitan para ejecución local/remota unos privilegios mínimos.

La configuración del sitio web tiene el acceso anónimo deshabilitado y la autenticación Windows integrada (Estamos en una intranet) y en el Web.Config impersonate a true con autenticación Windows.

Soluciones que no piensas:

  • Dar permisos de Adminsitrador a la cuenta MACHINE\ASPNET

 

 

ESTO NI SE TE OCURRA

  • Impersonar el hilo de ejecución de la aplicación con un usuario Adminsitrador

La gente de sistemas nunca te lo dará y además no me parece una buena solución puesto que vulnera muchos principios de seguridad como en el primer caso.

  • Hacer una impersonación sólo cuando generas el Informe con una cuenta de usuario que sea Adminsitrador

La gente de sistemas nunca te lo dará

Bueno, pues visto que esto va a ser que no, de repente, cacharreando con los Servicios de Componentes encuentro una cosita que se llama Configuración DCOM (Distributted Component Object Model) y al expandirlo me en cuanto con esto:

Sí!!!! Aplicación Microsoft Excel, esto pinta bien y además tiene propiedades, así que pinchamos:

Tiene una pestaña de Seguridad

Así que marcamos el check Personalizar de los Permisos de inicio y activación y pulsamos el botón Modificar para dar permisos al Usuario/Grupo que deseamos:

Todo esto funcionaba en un servidor con Windows Server 2003 y el IIS 7.0

Cuál fue mi sorpresa que en la máquina de producción se cambió s Windows Server 2008R2 y el IIS 7.5 y dejo de funcionar dándome el siguiente error:

[COMException (0x800A03EC): Microsoft Excel no puede acceder a ‘nombre de archivo «en el archivo. Hay varias razones posibles:
• El nombre del archivo o la ruta no existe.
• El archivo está siendo utilizado por otro programa.
• El libro que está intentando guardar tiene el mismo nombre que un libro abierto.

Solución:

Esto parece ser un problema con Excel / Word / etc no tener acceso a un perfil cuando se inicie a través de la ruta de interoperabilidad.

Pasos:

  1. Abrir el Explorador de Windows

Dependiendo de si ha instalado una versión de 32 bits o 64 bits de la oficina que tendrá que hacer uno (o ambos) de los siguientes:

  • Instalación de Office de 32 bits: Vaya a C: \ Windows \ System32 \ config \ SystemProfile
  • Instalación de Office de 64 bits: Vaya a C: \ Windows \ SysWOW64 \ config \ SystemProfile
  1.      Compruebe la carpeta «Desktop» existe (crearlo si no está ahí)

Haga clic derecho> Propiedades

En la ficha de seguridad: agregar la cuenta en la que el sitio está en marcha (por ejemplo: servicio de red) con los permisos predeterminados (Leer y ejecutar, Mostrar el contenido de la carpeta, Leer)

 

 

Y TODO ARREGLADOOOOOOOOOO!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Manuel Gómez

Categorías: ASP.NET Etiquetas: , , ,

Detectar dispositivo movil y redireccionar en ASP.NET

Hay muchas maneras y formas para poder detectar el dispositivo el cual se conecta a tu página web, pero voy a poner una de las maneras más sencillas y rápidas que hay.

Con esto quiero decir que funciona bien, es rápido, pero tiene sus carencias, como todas estas cosas, no hay nada que sea perfecto en todo.

Si lo que queréis es detectar si es un dispositivo móvil, poner el siguiente código en vuestro MasterPage o en vuestro Index para poder hacer la redirección:

string strUserAgent = Request.UserAgent.ToString().ToLower();

    if (strUserAgent != null)
    {
        if (Request.Browser.IsMobileDevice == true || strUserAgent.Contains(«iphone«) ||
        strUserAgent.Contains(«blackberry«) || strUserAgent.Contains(«mobile«) ||
        strUserAgent.Contains(«windows ce«) || strUserAgent.Contains(«opera mini«) ||
        strUserAgent.Contains(«palm«))
    {
        Response.Redirect(«http://www.m.tuweb.com/«);
    }
}

Espero que os sirva de ayuda, y con cualquier duda o problema, se intentará solucionar 😉

Categorías: ASP.NET Etiquetas: ,

Google abandona el SEO

Según confirma Matt Cutts en una entrevista realizada esta semana para la revista digital norteamericana “Technologies”, Google pasará en el 2012 a tener una gestión distinta a la hora de indexar, categorizar y calcular el PR de tu página.

 

matt-antiseo

 

Según comenta Matt Cutts, llevamos muchos años haciendo las cosas de la misma manera, siguiendo siempre las mismas directrices: h1, title, meta description, anchor text, long tail, etc, etc. Y comenta que se han apuntado al carro demasiada gente ya… No habla de granjas, ni webs de directorios, sino de páginas web cuyo único objetivo era posicionarse sin dar ningún valor añadido, por lo que no es ningún aporte para el resto de personas.

 

Todavía no está claro la nueva metodología SEO que hay que seguir, ya que los dispositivos móviles, tablets, HTML5 y demás van a hacer que cambie bastante la cosa, pero sólo nos queda esperar.

 

Como se dice que todo buen SEO tiene que estar en continuo aprendizaje e innovando en sus proyectos, en este caso con más razón. Espero que salga algo consolidado y no quedemos los SEO en el olvido.

Feliz día de los santos inocentes. Seo al poder! jeje

 

Un saludo. @eac9

Categorías: SEO

Centrar pagina web con css, con cabecera y pie (header y footer)

Esta entrada sería una ampliación a la anaterior, donde vimos como centrar una página web con css. Muchas veces, vemos en páginas web, que el contenido está centrado pero tanto en la cabecera como en el pie, tienen una decoración o una franja que se extiende todo lo horizontal de la pantalla. Con este simple código de CSS, podemos obtener este resultado. (No tengais en cuanta los colores y la maquetación, eso solo un ejemplo para que se vea claro jeje)

 

<HTML>
<head>
<style type="text/css">
body{
    text-align:center;
    margin:0 auto;
}
#contenedor{
    margin: 0 auto;
    text-align:left;
    width:900px;
    background-color:#CBCBCB;

}

#cabecera{
    background: url('./cabecera.gif') repeat-x scroll 0 0 white;
    height: 140px;
    text-align: center;
    margin-top: 0px;
    color:white;
}

.contenedorExterior{
    margin: 0 auto;
    padding: 0;
    width: 900px;
}

#footer {
     background: url('./barra.jpg') repeat-x scroll 0 0 white;
     height: 47px;
     text-align: left;
     padding: 10px;
     margin-top: 10px;
}
</style>
</head>

<body>
<div id="cabecera">
	<div class="contenedorExterior">
		<div style="float:left;width:200px; background-color:green">
			<p>Logo</p>
		</div>
		<div style="float:left;width:400px; background-color:red">
		<p>Menu</p>
		</div>
	</div>
</div>
<div id="contenedor">
    <div style="float:left; width:100%; background-color:yellow">
        <h1>Prueba de pagina centrada</h1>
    </div>
    <hr />
    <p>el texto que queramos</p>
    <br /><br /><br /><br /><br /><br />
    <br /><br /><br /><br /><br /><br />
</div>

<div id="footer">
	<div class="contenedorExterior">
		<p>Ejemplo de footer</p>
	</div>
</div>
</body>

</HTML>

Versión de descarga: header-footer.zip


Nota: Se usan un par de imágenes para la cabecera y para el pie, que vienen incluidas en el fichero de descarga.

Categorías: CSS Etiquetas: , , , , ,

Centrar pagina web con css

Muchas veces nos gustaria crear nuestra página web de manera centrara, independiente de la resolución de pantalla que tenga el usuario. Pues esto es una manera fácil y sencilla de hacerlo:

<HTML>
<head>
<style type="text/css">
body{
text-align:center;
margin:0 auto;
}
#contenedor{
margin: 0 auto;
text-align:left;
width:900px;
background-color:#CBCBCB;
}
</style>
</head>
<body>
	<div id="contenedor">
		<div style="float:left; width:100%; background-color:yellow">
			<h1>Prueba de pagina centrada</h1>
		</div>
		<hr />
		<p>el texto que queramos</p>
		<br /><br /><br /><br /><br /><br />
		<br /><br /><br /><br /><br /><br />
	</div>
</body>
</HTML>
Categorías: CSS Etiquetas: , , ,

¿Videojuegos educativos?

Podcast de la compañera Carmen Robles Azorin

Los vídeos de Vodpod ya no están disponibles.

Categorías: General

Comparativa navegadores Web

Primer PodCast en experienciasweb.org sobre Comparativa de navegadores web. Espero que os guste y hayan muchos más.

Los vídeos de Vodpod ya no están disponibles.

 

Añadir Meta Tags de forma dinámica en ASP.NET

Buenas, siguiendo con el hilo de detección del idioma del navegador del usuario, nos puede también interesar cambiar algunos Meta Tags de manera dinámica, como por ejemplo serían las web multi-idioma, para poder poner el Meta “description” o “content-language” en el idioma correspondiente.

La manera de realizarlo es dependiendo de la versión de ASP.NET donde estemos desarrollando.

Para ASP.NET 4.0:


Page.Title = "Cómo crear páginas web";
Page.MetaKeywords = "Web, asp.net, desarrollo web";
Page.MetaDescription = "Descripcion de nuestra página";

Para ASP.NET 2.0:


HtmlMeta meta = new HtmlMeta();
meta.Name = "content-language";
meta.Content = "es";
this.Header.Controls.Add(meta);
meta.Name = "description";
meta.Content = " Descripcion de nuestra página ";
this.Header.Controls.Add(meta);

Estos son ejemplos practices de cómo añadir meta tags de forma dinámica en ASP.NET, ya sólo es elegir los Meta que quieras usar y listo!

Categorías: ASP.NET Etiquetas: , ,

resumen guia SEO

Aquí os dejo un par de hojas resumen para los iniciados en SEO, el cual lo encuentro muy útil y así siempre lo tenemos a mano para que no se nos olvide nada.

Hoja Resumen (PDF): SEO_Web_Developer_Cheat_Sheet

 

 

Documentos de seomoz.org

Categorías: SEO Etiquetas: ,

Como detectar el idioma del navegador en ASP.NET

Este problema se plantea cuando tenemos nuestra página web en varios idiomas, y normalmente tenemos un desplegable o unas banderitas para que el usuario pueda cambiar de idioma. En este caso lo que queremos es poder saber el idioma con el que navega el usuario y así poder cargar la página en el idioma del usuario.

Este código nos permite averiguarlo:


string lang = Request.UserLanguages[0];
if (lang.ToLower().Contains("es"))
{
    //Idioma Español
}
else if (lang.ToLower().Contains("en"))
{
    //Idioma Ingles
}
else if (lang.ToLower().Contains("fr"))
{
    //Idioma Francés
}
else if (lang.ToLower().Contains("it"))
{
    //Idioma Italiano
}
else
{
    //Otro idioma
}

En este caso cogemos la primera opción que tenga el usuario en el navegador. Request.UserLanguages devuelve un Array con todos los idiomas que tenga configurado el usuario en su navegador, y en este caso yo cojo el primero.

Aclarar que existen distinción dentro de un mismo idioma, por ejemplo para el Inglés tenemos el Inglés de Estados Unidos (en-us), Inglés original(en)…, igual con el español:español-mexico(es-mx), español-argentina(es-ar); así que si nos hace falta controlar un idioma mas concreto, debemos tener encuenta esto.

Para poder hacer una prueba con tu propio navegador, puede configurar los idiomas, cambiando el orden de preferencia. Para Mozilla Firefox sería así:

Herramientas -> Opciones -> Contenido->Idiomas(seleccionar)

Cambiar idioma navegador

Espero que os sirva de utilidad y ánimo con vuestra web multi-idioma, que por experiencia sé que son duras de llevar.