Mystring.split(environment.newline) gagal antara windows dan linux

pemrograman


Halo semua,

Saya baru-baru ini memigrasikan aplikasi web dari Layanan Aplikasi Windows Azure ke Linux.
Saya sekarang mengalami masalah yang tidak saya perkirakan.
Karena saya baru mengenal Linux, saya pikir saya akan bertanya di sini.

Jadi pada dasarnya aplikasi web memungkinkan pengguna untuk mengunggah file teks dan aplikasi web kemudian mengirimkan teks tersebut ke layanan web yang berjalan di Windows untuk diproses lebih lanjut.

Inilah intinya:

C#
string content = await IFormFile.ReadAsStringAsync();

// Some code here, client is an HttpClient.

string json = JsonConvert.SerializeObject(new { content, something, somethingElse });
var httpcontent = new StringContent(json, Encoding.UTF8, MediaTypeNames.Application.Json);
using HttpResponseMessage response = await client.PostAsync("MyEndpoint", httpcontent).ConfigureAwait(false);

// Later in MyEndpoint...
var lines = content.Split(Environment.NewLine);

Saya berharap Split(Environment.NewLine) akan mengembalikan ratusan baris, tetapi saya hanya mendapatkan satu baris ketika saya memanggil titik akhir dari aplikasi web Linux.
Dugaan saya adalah Linux mengirimkan baris baru sebagai \n sementara Windows menggunakan \r\n.

Saya berharap JSON akan melakukan serialisasi ke \n dan kemudian layanan di Windows akan membatalkan serialisasinya sebagai \r\n.

Saya mungkin telah menggunakan banyak layanan yang berjalan di Linux dan saya tidak pernah khawatir dengan jalur baru saya.
Saya tidak ingin mengetahui layanan saya berjalan dan menyesuaikan jalur baru saya.
Apa yang saya lakukan salah?

Aplikasi web menggunakan .NET8 dan layanan web menggunakan .NET6. Keduanya berjalan di Azure Web Apps.

Apa yang saya coba:

Banyak logging untuk menemukan masalahnya.
Saya mengetahui solusinya, seperti memisahkan di aplikasi Linux dan kemudian mengirimkan baris ke Windows, atau memisahkan di \n alih-alih Environment.NewLine.
Melakukan googling, tetapi tidak dapat menemukan jawaban sebenarnya untuk masalah saya.

Solusi 1

Karena Anda menggunakan .NET 6, Anda dapat mencoba menggunakan Metode MemoryExtensions.EnumerateLines[^] metode, yang seharusnya menangani baris baru Windows dan Linux untuk Anda.

C#
List<string> lines = [];
foreach (ReadOnlySpan<char> line in content.AsSpan().EnumerateLines())
{
    lines.Add(line.ToString());
    // Or process the line here without creating a string, to avoid the allocation...
}

Atau Anda bisa mencobanya Metode String.ReplaceLineEndings[^]meskipun itu akan mengalokasikan string baru.

Mengutip:

Daftar urutan baris baru yang dikenali adalah CR (U+000D), LF (U+000A), CRLF (U+000D U+000A), NEL (U+0085), LS (U+2028), FF (U+000C ), dan PS (U+2029). Daftar ini diberikan oleh Unicode Standard, Sec. 5.8, Rekomendasi R4 dan Tabel 5-2.

コメント

タイトルとURLをコピーしました