GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Klassische Path.DirectorySeparatorChar-Probleme beim Wechsel von .NET Core unter Windows zu Linux

Ein wichtiger Schritt bei der Umstellung meines Blogs auf Azure war die Überlegung, diese .NET-App zu erwerben, die jetzt ein .NET Core ist App, die unter Linux UND Windows ausgeführt werden kann. Die Möglichkeit, unter Linux und Windows ausgeführt zu werden, würde mir und anderen eine größere Auswahl an Hosting bieten, das Hosting in Linux-Containern ermöglichen und mir Geld sparen, da Linux-Hosting tendenziell billiger ist, sogar auf Azure.

Etwas unter Linux zu kompilieren ist natürlich nicht dasselbe wie es zum Laufen zu bringen.

Außerdem kann etwas in einem Kontext gut laufen und in einem anderen nicht. Mein Partner Mark (poppastring) bei diesem Projekt führt diesen Code seit einiger Zeit unter .NET aus, allerdings unter Windows. Zusätzlich läuft er auf IIS in /blog als Unteranwendung. Ich führe Linux auf Azure aus, und während ich mich auch auf /blog befinde, befindet sich meine Website hinter Azure Front Door als Reverse-Proxy, der die Domäne/den Blog/den Pfad verarbeitet und entlang der Domäne/dem Pfad an die App weiterleitet.

Um es kurz zu machen, es hat sowohl in seinem Blog als auch in meinem funktioniert, bis ich versuchte, einen neuen Blog-Beitrag zu veröffentlichen.

Ich verwende Open Live Writer (Open-Source-Version von Windows Live Writer), um einen MetaWebLog-API-Aufruf an mein Blog zu senden. Es gibt mehrere Aufrufe zum Hochladen der Binärdateien (PNGs) und es wird ein Pfad zurückgegeben. Eine neu hochgeladene Binärdatei könnte einen Pfad wie https://hanselman.com/blog/content/binary/something.png haben. Die Datei auf der Festplatte (aus Sicht des Servers) könnte d:\whatever\site\wwwroot\content\binary\something.png sein.

Dies ist 15 Jahre altes ASP.NET 1, also gibt es hier ein paar idiomatische Dinge, die nicht modern sind, außerdem wurden die Variablen für das Debuggen des Überwachungsfensters hinzugefügt, aber sehen Sie das potenzielle Problem?

private string GetAbsoluteFileUri(string fullPath, out string relFileUri)
{
var relPath = fullPath.Replace(contentLocation, "").TrimStart('\\');
var relUri = new Uri( relPath, UriKind.Relative);
relFileUri = relUri.ToString();
return new Uri(binaryRoot, relPath).ToString();
}

Das '\\' macht eine große Annahme. 2003 ein vernünftiger, heute ein großer. Es schneidet einen umgekehrten Schrägstrich am Anfang der übergebenen Zeichenfolge ab. Dann fängt der Uri-Konstruktor an, Sachen zu machen, und wir mischen und passen \ und / an und am Ende haben wir abgeschnittene URLs, die sich nicht auflösen lassen.

Annahmen über Pfadtrennzeichen sind ein Hauptproblem beim Verschieben von .NET-Code auf Linux oder Mac, und es ist oft tief in nützlichen Methoden wie dieser vergraben.

var relPath = fullPath.Replace(contentLocation, String.Empty).TrimStart(Path.DirectorySeparatorChar);

Wir können die richtige Konstante für Path.DirectorySeparatorChar oder das wenig bekannte AltDirectorySeparatorChar verwenden, da Windows beides unterstützt. Aus diesem Grund funktioniert dieser Code in Marks Windows-Bereitstellung, wird aber nicht unterbrochen, bis er auf meiner Linux-Bereitstellung ausgeführt wird.

DOKUMENTE: Beachten Sie, dass Windows entweder den Schrägstrich (der vom Feld AltDirectorySeparatorChar zurückgegeben wird) oder den umgekehrten Schrägstrich (der vom Feld DirectorySeparatorChar zurückgegeben wird) als Pfadtrennzeichen unterstützt, während Unix-basierte Systeme nur den Schrägstrich unterstützen.

Es ist auch erwähnenswert, dass jedes Betriebssystem unterschiedliche ungültige Pfadzeichen hat. Ich habe einige 404-Bilder, weil einige meiner Dateien führende Leerzeichen unter Linux, aber Unterstriche unter Windows haben. Mehr dazu )(und andere obskure, aber lustige Bugs/Verhalten) in zukünftigen Posts.

static void Main()
{
Console.WriteLine($"Path.DirectorySeparatorChar: '{Path.DirectorySeparatorChar}'");
Console.WriteLine($"Path.AltDirectorySeparatorChar: '{Path.AltDirectorySeparatorChar}'");
Console.WriteLine($"Path.PathSeparator: '{Path.PathSeparator}'");
Console.WriteLine($"Path.VolumeSeparatorChar: '{Path.VolumeSeparatorChar}'");
var invalidChars = Path.GetInvalidPathChars();
Console.WriteLine($"Path.GetInvalidPathChars:");
for (int ctr = 0; ctr < invalidChars.Length; ctr++)
{
Console.Write($" U+{Convert.ToUInt16(invalidChars[ctr]):X4} ");
if ((ctr + 1) % 10 == 0) Console.WriteLine();
}
Console.WriteLine();
}

Hier sind einige Artikel, die ich bereits zum Thema Legacy-Migrationen in die Cloud geschrieben habe.

  • Migration dieses Blogs zu Azure
  • Cloud-Migrationen in der realen Welt:Umzug einer 17 Jahre alten Serie von Websites von Bare Metal zu Azure
  • Umgang mit Anwendungsbasis-URLs und Razor-Linkgenerierung beim Hosten von ASP.NET-Web-Apps hinter Reverse-Proxys
  • Aktualisieren einer ASP.NET Core 2.2-Website auf .NET Core 3.1 LTS
  • Verschieben eines ASP.NET Core von Azure App Service unter Windows zu Linux durch vorheriges Testen in WSL und Docker

Wenn Sie Probleme mit diesem Blog finden, wie

  • Fehlerhafte Links und 404-Fehler, wo Sie sie nicht erwarten würden
  • Zerbrochene Bilder, Null-Byte-Bilder, riesige Bilder
  • Allgemeine Merkwürdigkeit

Bitte reichen Sie sie hier ein https://github.com/shanselman/hanselman.com-bugs und lassen Sie es mich wissen!

Oh, und bitte abonnieren Sie mein YouTube und erzählen Sie es Ihren Freunden. Es ist wunderbar.

Sponsor: Haben Sie schon versucht, in Rider zu entwickeln? Diese schnelle und funktionsreiche plattformübergreifende IDE verbessert Ihren Code für .NET-, ASP.NET-, .NET Core-, Xamarin- und Unity-Anwendungen unter Windows, Mac und Linux.


Linux
  1. NuGet für .NET Core unter Linux

  2. .NET Core X509Store unter Linux

  3. Datei von windows nach linux kopieren

  4. scp von entferntem Linux zu lokalem Windows mit Leerzeichen im lokalen Pfad

  5. RDP von Linux zu Windows

Umstieg von Windows auf Linux – Datenträgerverwaltung

Abkehr von Windows – Es beginnt

Offizieller Support für das Remotedebuggen einer .NET Core-Linux-App in WSL2 von Visual Studio unter Windows

Verschieben eines ASP.NET Core von Azure App Service unter Windows zu Linux, indem zuerst in WSL und Docker getestet wird

Remotedebuggen einer .NET Core-Linux-App in WSL2 von Visual Studio unter Windows

So kompilieren Sie die .NET Core-App für Linux auf einem Windows-Computer