GNU/Linux >> Belajar Linux >  >> Linux

Jalur Klasik.DirectorySeparatorChar mendapat masalah saat berpindah dari .NET Core di Windows ke Linux

Langkah penting dalam memindahkan blog saya ke Azure adalah mempertimbangkan untuk mendapatkan aplikasi .NET ini, sekarang menjadi .NET Core aplikasi, untuk dijalankan di Linux DAN Windows. Mampu berjalan di Linux dan Windows akan memberi saya dan orang lain pilihan hosting yang lebih luas, memungkinkan hosting di Linux Containers, dan bagi saya, menghemat uang saya karena Hosting Linux cenderung lebih murah, bahkan di Azure.

Mendapatkan sesuatu untuk dikompilasi di Linux tidak sama dengan menjalankannya, tentu saja.

Selain itu, sesuatu mungkin berjalan dengan baik dalam satu konteks dan bukan yang lain. Mitra saya Mark (poppastring) pada proyek ini telah menjalankan kode ini di .NET untuk sementara waktu, meskipun di Windows. Selain itu ia berjalan di IIS di /blog sebagai subaplikasi. Saya menjalankan Linux di Azure, dan sementara saya juga di /blog, situs saya berada di belakang Azure Front Door sebagai proxy terbalik yang menangani domain/blog/jalur dan meneruskan domain/jalur ke aplikasi.

Singkat cerita, ini berhasil di blognya dan saya, sampai saya mencoba memposting posting blog baru.

Saya menggunakan Open Live Writer (versi open source Windows Live Writer) untuk membuat panggilan API MetaWebLog ke blog saya. Ada beberapa panggilan untuk mengunggah binari (PNG) dan jalur dikembalikan. Biner yang baru diunggah mungkin memiliki jalur seperti https://hanselman.com/blog/content/binary/something.png. File pada disk (dari sudut pandang server) mungkin d:\whatever\site\wwwroot\content\binary\something.png.

Ini adalah ASP.NET 1 berusia 15 tahun, jadi ada beberapa hal idiomatis yang terjadi di sini yang tidak modern, ditambah vars telah ditambahkan untuk debugging jendela arloji, tetapi apakah Anda melihat potensi masalah?

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();
}

Itu '\\' membuat asumsi besar. Yang masuk akal pada tahun 2003, tetapi yang besar hari ini. Ini memangkas garis miring terbalik dari awal string yang diteruskan. Kemudian konstruktor Uri mulai datang dan kami mencampur dan mencocokkan \ dan / dan kami berakhir dengan URL terpotong yang tidak terselesaikan.

Asumsi tentang pemisah jalur adalah masalah utama saat memindahkan kode .NET ke Linux atau Mac, dan sering kali terkubur dalam metode utilitas seperti ini.

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

Kita dapat menggunakan konstanta yang benar untuk Path.DirectorySeparatorChar, atau AltDirectorySeparatorChar yang kurang dikenal karena Windows mendukung keduanya. Itulah mengapa kode ini berfungsi pada penerapan Windows Mark, tetapi tidak akan rusak hingga kode ini dijalankan pada penerapan Linux saya.

DOCS: Perhatikan bahwa Windows mendukung garis miring (yang dikembalikan oleh bidang AltDirectorySeparatorChar) atau garis miring terbalik (yang dikembalikan oleh bidang DirectorySeparatorChar) sebagai karakter pemisah jalur, sedangkan sistem berbasis Unix hanya mendukung garis miring.

Perlu juga dicatat bahwa setiap OS memiliki karakter jalur tidak valid yang berbeda. Saya memiliki beberapa gambar 404 karena beberapa file saya memiliki spasi terdepan di Linux tetapi menggarisbawahi pada Windows. Lebih lanjut tentang itu )(dan bug/perilaku tidak jelas tapi menyenangkan lainnya) di posting mendatang.

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();
}

Berikut beberapa artikel yang sudah saya tulis tentang masalah migrasi lama ke cloud.

  • Migrasi blog ini ke Azure
  • Migrasi Cloud Dunia Nyata:Memindahkan serangkaian situs berusia 17 tahun dari bare metal ke Azure
  • Berurusan dengan URL Basis Aplikasi dan pembuatan tautan Razor saat menghosting aplikasi web ASP.NET di belakang Proksi Terbalik
  • Memperbarui Situs Web ASP.NET Core 2.2 ke .NET Core 3.1 LTS
  • Memindahkan ASP.NET Core dari Azure App Service di Windows ke Linux dengan menguji di WSL dan Docker terlebih dahulu

Jika Anda menemukan masalah dengan blog ini seperti

  • Tautan rusak dan 404 yang tidak Anda duga
  • Gambar rusak, gambar nol byte, gambar raksasa
  • Keanehan umum

Silakan ajukan di sini https://github.com/shanselman/hanselman.com-bugs dan beri tahu saya!

Oh, dan tolong berlangganan ke YouTube saya dan beri tahu teman-teman Anda. Ini indah.

Sponsor: Sudahkah Anda mencoba mengembangkan di Rider? IDE lintas platform yang cepat dan kaya fitur ini menyempurnakan kode Anda untuk aplikasi .NET, ASP.NET, .NET Core, Xamarin, dan Unity di Windows, Mac, dan Linux.


Linux
  1. Matikan mesin Windows dari terminal linux

  2. Apakah Visual Basic didukung oleh .NET Core di Linux?

  3. NuGet untuk .NET Core di Linux

  1. Salin file dari linux ke windows share dengan C# (.NET core)

  2. .NET core X509Store di linux

  3. RDP dari linux ke windows

  1. Menggunakan Windows DLL dari Linux

  2. Cara menghapus versi .NET Core sebelumnya dari Linux (CentOS 7.1)

  3. menyalin file dari windows ke Linux