Este es un error muy típico en algunas aplicaciones y me he acordado de él a raíz de la pregunta de un alumno de mi curso de preparación del examen 70-515 en campusMVP.

La situación es la siguiente: tenemos un desarrollo ASP.NET hecho y todo funciona en Visual Studio a las mil maravillas. Lo publicamos al servidor Web y de repente, al intentar acceder al sitio Web, nos encontramos un error como este:

ErrorBC30456

“¿Cómo?¿Inicializar cultura? Pero si yo no tengo nada de esto en mi aplicación. ¿Qué demonios pasa aquí?“

Por más que buscas en tu código no eres capaz de encontrar nada mal, y es que además “¡en mi máquina funciona!” (que es lo que decimos todos cuando algo falla en producción).

El problema viene de un hábito muy común y que, realmente, Visual Studio debería gestionar mejor: renombrar páginas ASPX en Sitios Web.

Lo típico es lo siguiente:

  1. Renombramos la página Default.aspx que tenemos por defecto en el proyecto. Para ello pulsamos sobre ella en el Explorador de soluciones y pulsamos F2 o usamos la acción de renombrar en el menú contextual.
  2. Comprobamos que tanto la página como su correspondiente archivo code-behind se han cambiado de nombre correctamente.
  3. Más adelante nos damos cuenta de que necesitamos una página Default.aspx y añadimos una nueva página con este nombre al proyecto.
  4. Ahora publicamos la aplicación al servidor Web. Para ello la pre-compilamos usando el menú “Publicar” del menú contextual del proyecto Web, como se ve en la siguiente figura, dejando los valores por defecto en esta pantalla.

ErrorBC30456_Publicar

Al ir ahora al servidor nos encontramos con el error.

¿Cuál es el problema?

El problema es que aunque Visual Studio renombra los archivos .aspx y .aspx.cs (o .vb) de la página en cuestión, lo que no hace es cambiarle el nombre a la clase subyacente que se encuentra en el archivo de código. Esto hace que haya dos clases con el mismo nombre en el proyecto, lo cual confunde al runtime de .NET.

El error que muestra no es nada intuitivo y no parece tener nada que ver con el asunto, pero así es.

¿Cuál es la solución?

Hay dos posibles soluciones:

  1. Buscar las clases duplicadas y renombrarlas. Probablemente será fácil ya que por regla general suele ser la página “Default” la que hemos renombrado.
    Es importante fijarse en que no sólo llega con cambiar el nombre de la clase, sino que además hay que cambiarlo también en la directiva @page de la página, como se ve en la figura:

    ErrorBC30456_Corregir
    Con esto el problema quedará resuelto y es la mejor opción posible.
  2. La segunda solución consiste en desmarcar la opción de “Permitir que este sitio sea actualizable” en el cuadro de diálogo de publicación.

    ErrorBC30456_PublicarAjustes

    Con esto lo que conseguimos es que todo el código HTML de las páginas .aspx se conserve en los correspondientes archivos al desplegar (si lo tenemos marcado los archivos existen pero son simples comodines sin contenido). Al hacer esto la compilación del proyecto será solamente parcial y toda la definición de los formularios Web se realiza dinámicamente en memoria  a la hora de utilizarlos, y por eso no nos da un error al entrar ya que las clases que entran en conflicto en el otro caso no se dan en este estado de compilación.

De todos modos esta segunda opción es un “apaño”, y la buena es la primera: localizar las clases duplicadas y renombrarlas.

¿Por qué en Visual Studio no ocurre?

No se produce porque en el servidor de desarrollo de Visual Studio la compilación siempre es dinámica en memoria, y no hay un paso previo de publicación como en este caso, así que no hay conflicto tampoco.

Por cierto, en los proyectos de tipo Aplicación Web tampoco se produce nunca este problema ya que éstos siempre se compilan a una única DLL y se detectará el conflicto a la hora de compilar. Es más: en este tipo de proyectos Visual Studio detecta la situación al renombrar las páginas y también cambia el nombre a las clases correspondientes, algo que debería hacer en los sitios web pero no hace :-S

¡Espero que te sea útil!

Escrito por un humano, no por una IA