JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Solucionar el error: “BC30456: 'InitializeCulture' is not a member of” en ASP.NET

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!

¿Te ha gustado este post? - Aprende .NET con los cursos on-line tutelados de campusMVP:
   ·
Preparación del examen 70-515: Desarrollo Web con .NET 4.0 (Tutelado por mi)
   · Desarrollo Web con ASP.NET 4.0 Web Forms (Tutelado por mi)
   · ASP.NET 4.0 Web Forms desde cero (Tutelado por mi)
   · Desarrollo Web con ASP.NET MVC 3 
   · Silverlight 4.0 - Aplicaciones Ricas para Internet (RIA)
   · jQuery paso a paso para programadores ASP.NET
   · Visual Studio 2010 desde cero

José Manuel Alarcón José Manuel Alarcón
Fundador y director de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Comentarios (16) -

Colombia Cesar Verano

Gracias, fue de gran ayuda

Responder

Muchas gracias fue de mucha ayuda esta informacion....

Responder

Guatemala Jose Ramirez

Muchas gracias, me estaba volviendo loco con esto......

Responder

muy buen aporte
Gracias !!!

Responder

Mexico Carlos Peña

Excelente aportación, gracias!

Responder

Mexico efrain flores garcia

Eres grande carnal

Responder

Me ayudo bastante, no tenia ni idea, tal como lo mencionas de como solucionarlo.

Excelente tu aporte

Responder

Peru Carlos Chirinos

Gracias, me sirvio de mucha ayuda....

Responder

Que bien explicado.

Responder

Excelente explicación amigo, gracias

Responder

Costa Rica Eduardo Alfaro

De haber leído esto primero, me hubiese economizado 8 horas de trabajo. Muchísimas gracias.

Responder

Hola amigo sumamente útil, me ahorraste horas de perdida de tiempo tratando de resolver algo en apariencia tan sencillo.! Saludos

Responder

La primera opción a mí no me sirvió; quizá mi caso es diferente ya que tengo diferentes páginas default.aspx en diferentes directorios heredando de la misma clase y mismo archivo. Los nombres del archivo y clase no estaban duplicados en ninguna parte pero puede que el runtime hiciera un lío. A priori no me parece mala opción, ¿que inconvenientes tiene?

Responder

cojonuda la explicación y la solución.

Me fue de gran ayuda, tenia el problema y se me soluciono.

Un saludo.

Responder

Muy bueno!
Gracias, muy util porque la descripcion del error no te dice nada de lo que realmente es

Responder

Agregar comentario