Konvertieren eines Website-Projekts in eine Webanwendung in Visual Studio

Früher war der Projekttyp „Website“ in Visual Studio (VS) der bevorzugte, um eine WebForms-Website mit ASP.NET zu erstellen.

Das waren Dateien, die automatisch vom System beim ersten Aufruf kompiliert wurden.

Inzwischen ist der Projekttyp „Webanwendung“ der primär genutzte.

Um ein Projekt von Website nach Webanwendung zu konvertieren gibt es leider keinen 100%-Automatismus.

Stattdessen hat Microsoft im Artikel „Walkthrough: Converting a Web Site Project to a Web Application Project in Visual Studio“ einen groben Ablauf skizziert.

Nachfolgenden dieser Ablauf plus den Schritten, die ich selbst immer noch gemacht habe.

Ablauf

  1. Die VS-Solution, die die Website enthält, in VS öffnen.
  2. Einen neuen Projekttyp „Webanwendung“ erstellen.
    • Bei „Template“ das Template „Empty“ auswählen.
    • Das Kontrollkästchen „Web Forms“ aktivieren.
  3. Alle Dateien (außer BIN und web.config sowie ggf. den Web-Referenzen) aus dem Website-Projekt in das Webanwendung-Projekt kopieren (das mache ich im Windows Explorer) und dann in Visual Studio hinzufügen (vorher „Show All Files“ in der Toolbar im Solution Explorer aktivieren).
  4. Im Menü „Project“ auf „Convert to Web Application“ auswählen.
  5. Fehlende NuGet-Referenzen sowie normale BIN-Referenzen ergänzen.
  6. Web-Referenzen manuell neu hinzufügen.
  7. „Web.config“-Datei manuell inhaltlich übertragen.

Danach sollte schon alles kompilieren.

Aus Finetuning-Eleganz-Gründen mache ich dann im Groben noch folgende Schritte:

  1. In den Eigenschaften (F4) des Ordners „App_Code“ den Wert von „Namespace Provider“ auf „true“ stellen.
  2. Für alle ASMX-Dateien den Code-Behind als untergeordnet einfügen/verschieben und ggf. umbenennen. Für eine „Example.asmx“ sollte der Code-Behind „Example.asmx.cs“ heißen. Dazu muss dann auch die ASMX-Datei sowie die CSPROJ-Datei bearbeitet werden.
  3. Für alle ASHX-Dateien einen Code-Behind anlegen, so wie in diesem SO-Posting beschrieben.
  4. Dateien aus dem alten „App_Code“-Ordner entsprechend verschieben, dahin, wo sie logisch hingehören.
  5. Ggf. noch den Root-Namespace und den Namen der erstellten Assembly anpassen.
  6. Namspaces erstellen lassen (via ReSharper-Refactoring). Vorher alle // ReSharper disable once CheckNamespace-Kommentare entfernen.
  7. Da obiger Befehl auch den Namespace der Datei „App_GlobalResources/Resources.designer.cs“ ändert, die „Resources.resx“-Datei öffnen, ändern, speichern, zurück ändern und nochmals speichern. Das erstellt wieder den richtigen Namespace für die Datei. Ggf. auch für die „App_LocalResources“-Dateien.
  8. Alle BIN-Referenzen entsprechend auf „Copy Local“ = TRUE setzen (außer .NET-Framework-Referenzen)
  9. Code-Behind-Klassen so umbenennen, dass sie ohne Unterstrich sind. Z.B. UI_MyFolder_MyWebForm umbenennen in MyWebForm.
  10. Ggf. noch vorhandende CodeFile="..."-Attribute in der @Page-Direktive der Seiten, Controls und Master-Pages entfernen.
  11. Ggf. fehlende „Global.asax.cs“-Datei ergänzen und durch Aufsplitten der „Global.asax“-Datei generieren.
  12. Jetzt nochmals im Menü „Project“ auf „Convert to Web Application“ auswählen. Da nun alle Klassennamen und Namespaces passen, sollte er noch fehlende „.designer“-Dateien generieren.

Publish

Beim Publish sind jetzt keine GAC-Refenzsuchen mehr nötig. Ebenfalls brauchen keine .CS-Dateien mehr mit veröffentlicht werden:

Also folgende Substrings ausschließen:

  • „.master.cs“,
  • „.aspx.cs“,
  • „.asmx.cs“,
  • „.ascx.cs“,
  • „.ashx.cs“,
  • „.asax.cs“,
  • „.designer.cs“

Und auch Dateien allgemein mit „.cs“ am Ende (Vorsicht, keine „.css“ mit ausschließen → "[RX]\\.cs$").

Am Besten vor dem Publish einmalig alles im Ziel löschen (außer den Konfigurationsdateien wie „web.config“ und dem „App_Data“-Ordner), damit die ganzen Quelltexte, die noch auf dem Server liegen (z.B. in „App_Code“) ordentlich entfernt werden.