Cómo convertir un sitio web ASP.NET a una aplicación web ASP.NET

Tengo un sitio web ASP.NET 3.5 (jerga de estudio visual), pero el sitio sigue creciendo y se ve bastante vaquero, entre otras cosas. Me gustaría ver que esto se convierta en una aplicación web (espacios de nombres y todo).

¿Es esto algo que se puede hacer fácilmente en Visual Studio? Si no, ¿hay alguna otra herramienta que pueda crear todos los espacios de nombres, etc. automágicamente?

Bueno, resulta que la opción “Convertir a aplicación web” NO existe para “sitios web”. La opción “Convertir a aplicación web” existe solo para “aplicaciones web” !!!!

[énfasis mío]

Entonces, este es el trato, para hacer la conversión, necesitas:

  • Agregue una nueva “Aplicación web” a su solución VS 2008 (Archivo-> Agregar-> Nuevo proyecto-> C # -> Web-> Aplicación web ASP.NET).

  • Después, copia todos los archivos en el “sitio web” anterior a su “aplicación web” recién creada y anula los archivos creados en él de manera predeterminada

  • El siguiente paso es el más feo, necesita agregar “manualmente” las referencias en su “sitio web” a la nueva “aplicación web”. Pensé que el juguete VS 2008 PowerCommands haría esto por mí, ya que copia referencias de otros tipos de proyectos, pero no fue así. Tiene que hacerlo usted mismo, de forma manual, y debe tener cuidado en este paso si tiene múltiples versiones del mismo ensamblaje (como AJAXToolkit en mi caso) o ensamblajes que tienen tanto GAC como versiones locales más o menos.

  • Continúa repitiendo el último paso e intentando crear la “aplicación web”. Seguirás obteniendo errores como “‘….’ es un espacio de nombres desconocido. ¿Te está faltando una referencia de ensamblado?”. Asegúrese de no tener ninguno de esos, excepto aquellos en los que ‘….’ se reemplaza por los ID de los controles del servidor que usa. En otras palabras, siga agregando referencias y construyendo el proyecto hasta solo los errores que existen debido a la falta de los archivos .DESIGNER.CS o .DESIGNER.VB.

  • Luego, vaya al nodo del proyecto raíz “aplicación web” en el explorador de soluciones VS 2008, y haga clic con el botón derecho en él, luego encontrará la opción “Convertir a aplicación web”. Lo que esta opción hace es hacer pequeños cambios a las directivas “@Page” y “@Control” de páginas y controles, y crear los archivos necesarios .DESIGNER.CS o .DESIGNER.VB.

  • Intente construir la “aplicación web” nuevamente. Si obtiene errores, vea qué referencias pueden faltar y / o haga clic nuevamente en “Convertir a la aplicación web”. A veces, si hay algún otro error además de los causados ​​por la falta de archivos DESIGNER, no todas las páginas / controles tendrán esos archivos DESIGNER creados para ellos. Reparar el problema no DESIGNER y hacer clic en “Convertir a aplicación web” nuevamente debería hacer el trabajo para esto.

  • Una vez que haya terminado la comstackción VS exitosa, debe estar listo para funcionar. Comience a probar su aplicación web. Opcionalmente, puede hacer clic derecho en el nodo del proyecto raíz “aplicación web” en VS 2008 Solution Explorer y hacer clic en “Propiedades”, luego ir a la pestaña “Web” para configurar la “aplicación web” en una carpeta virtual en IIS (puede crear nuevas directorio virtual desde allí en VS). Si desea utilizar el directorio virtual de IIS que utilizó el antiguo “sitio web”, primero debe eliminarlo de IIS.

  • Actualización: Cuando pruebe sus páginas, preste MÁS ATENCIÓN a las clases en la carpeta “Código_Ap_”, especialmente aquellas que NO TIENEN ESPACIO NOMBRE. Esos pueden ser una gran trampa. Tuvimos un problema con dos sobrecargas de métodos de extensión en la misma clase estática que no tenía espacio de nombres, ¿se extiende DateTime? (Nullable) y llama a otra sobrecarga que extiende DateTime. Llamar a la otra sobrecarga como método de extensión pasó la comstackción de VS 2008 y nos dio un error de comstackción SOLAMENTE EN RUNTIME (con IIS). Cambiar la llamada a la otra sobrecarga de llamarlo como método de extensión para llamarlo como método estático normal (solo cambiar la llamada en la misma clase, las llamadas de otras clases se mantuvieron como llamadas al método de extensión) sí resolvió esta, pero claramente, no es tan seguro como solía ser en VS 2005. Especialmente con clases sin espacios de nombres.

  • Actualización2: durante la conversión, VS 2008 cambia el nombre de su “App_Code” a “Old_App_Code”. Este nuevo nombre suena feo, pero NO LO VUELVA A VUELCAR. En el modelo de “aplicación web”, todo el código estará en un ensamblaje. En tiempo de ejecución, el servidor web no sabe qué tipo de proyecto web está usando. Toma todo el código en la carpeta “Código_aplicación” y crea un nuevo conjunto para él. De esta forma, si tiene un código en la carpeta denominada “Código_aplicación”, terminará con errores de comstackción RUNTIME que indican que existen los mismos tipos en dos conjuntos, el creado por VS y el creado por el Servidor de desarrollo IIS / ASP.NET . Para evitar eso deje el “Old_App_Code” con el mismo nombre o cámbiele el nombre a NADA EXCEPTO: “App_Code”. No coloque ningún código en dicha carpeta “App_Code” y preferiblemente NO tenga una carpeta con ese nombre en su “aplicación web”.

Lo sé desde antes, pero lo olvidé porque no he usado el modelo de “sitio web” por mucho tiempo :(.

Tutorial: conversión de un proyecto de sitio web a un proyecto de aplicación web en Visual Studio en MSDN

Si la aplicación de su sitio web crece … es mejor dividirla en varios proyectos. La conversión de proyecto de sitio web a proyecto de aplicación web no ayudará mucho.

Si tiene problemas para crear su nuevo Proyecto de Aplicación Web, compruebe las Propiedades de Archivo en Visual Studio de todas las clases ‘auxiliares’. Para un proyecto que estaba convirtiendo, Build Action se configuró en Content mientras que debería haber sido Compile.

Al principio estaba enfrentando los mismos problemas. Después de seguir el libro de Wrox Professional ASP.NET 4.0, encontré la siguiente solución para mi caso.

Primero creé una nueva aplicación web. Copió todos los archivos del sitio web en la carpeta de la aplicación web. Haga clic con el botón derecho en la aplicación y haga clic en conversar a la aplicación web.

Puede preguntar por qué necesita convertir una aplicación web en una aplicación web. La respuesta es que cuando crea un sitio web, simplemente codifica el archivo .cs donde sea necesario. Sin embargo, una aplicación web declara automáticamente .design.cs (o .vb) y un archivo .cs para el código y la sección de diseño.

SIGUIENTE: Elimine todas las referencias manuales, como el atributo ‘Heredas’ en la directiva PAGE, a otros archivos en su sitio web, ya que los espacios de nombre se encargarán de hacer referencia central a las clases.

También me enfrenté a un problema, ya que no había incluido la carpeta OBJ y BIN en mi proyecto. Si crees que te faltan las carpetas BIN y OBJ, simplemente haz clic en el ícono “Mostrar todos los archivos” en el Explorador de soluciones y luego haz clic con el botón derecho en las carpetas que faltan y añádelo al proyecto. (para asegurarse de que comstackn con el proyecto).

ACTUALIZACIÓN: como señala @deadlychambers en los comentarios: puede buscar en todas partes haciendo “Ctrl + Shift + F” y luego buscar Inherits="(.*?)" . ¡Esto encontrará todas las ocurrencias y probablemente le ahorrará tiempo!

Cree una nueva aplicación web en VS 2010.
1. Usando Windows Explorer, copie todos sus archivos en su carpeta de proyectos.
2. En VS 2010, el explorador de soluciones muestra todos los archivos.
3. Seleccione los archivos y las carpetas: haga clic con el botón derecho incluir en el proyecto.
4. Haga clic con el botón derecho en el explorador de soluciones del proyecto y seleccione Convertir a aplicación web.

Hay bastantes pequeñas diferencias, como que la carpeta App_Code pasará a llamarse old_app_code, lo que sorprendentemente no causa ningún error. El TypeName en sus orígenes de datos de objeto y los heredados en la etiqueta @Page pueden necesitar el [ProjectName]. prefijo añadido globalmente. Por ejemplo, si su nombre de tipo es “BusinessLogic.OrderManager” y su nombre de proyecto es InventorySystem, deberá cambiarlo a InventorySystem.BusinessLogic.OrderManager. Además, algunos cambios en la pantalla, como los validadores de campo obligatorios, ya no se cambian a la fuente roja, sino que se cambian a negro por defecto.

Ahora he migrado con éxito un proyecto de sitio web a una aplicación web y hay pocos inconvenientes a tener en cuenta.

Tener ReSharper a su disposición ayuda mucho en la refactorización de los archivos aspx.

  1. Configure su solución y cree una aplicación web vacía
  2. Copie todo el archivo
  3. Los archivos aspx en proyectos de sitios web no tienen namspace. Envuelva sus clases en los espacios de nombres apropiados
  4. Durante la copia, todas mis páginas en subcarpetas fueron renombradas a mi nombre de proyecto y al nombre de la carpeta, así que obtuve 40ish public partial class FolderName_Projectname : Page Si es necesario, cambie el nombre de todos los archivos usando Resharper o manualmente. Si encuentra varios errores como "There is already a member Page_Load() defined" , es probable que esto se deba a nombres incorrectos y duplicación de clases
  5. Después de agregar un espacio de nombres
  6. Reemplace CodeFile en todas las páginas aspx con Codebehind y especialmente preste atención a los archivos en su subcarpeta. Asegúrese de que Inhertis="" no contenga la ruta relativa. Tus espacios de nombres se encargan de todo. Entonces el formato correcto es Inherits="Namespace.classname" . Si tu clase tiene un espacio de nombres NaSpa y un nombre de archivo foo.cs, sería Inherits="NaSpa.foo"

  7. Después de haber preparado todos sus archivos (no olvide las páginas maestras), ejecute “Convertir a aplicación web”. Si encuentra errores después, enjuague y repita. Si encuentra errores del tipo “No se puede encontrar el TextBoxName, ¿falta una referencia?”, Asegúrese de no haber olvidado desinfectar sus páginas aspx. Un buen indicador es verificar los archivos de diseñador generados automáticamente. Si TextBoxName no aparece allí, la conversión no tuvo éxito por completo.

  8. Resuelva las dependencias faltantes.
  9. Construir

el espacio de nombre de ASP predeterminado ya no parece funcionar. Así que no puedo llamar a mis páginas de User Controls.ascx desde fuera de la página. Darles un espacio de nombres y cambiar el valor predeterminado de ASP a mi espacio de nombres parecía funcionar.