Mystring.split(environment.newline) không thành công giữa windows và linux

lập trình


Chào mọi người,

Gần đây tôi đã di chuyển một ứng dụng web từ Dịch vụ ứng dụng Windows Azure sang ứng dụng Linux.
Bây giờ tôi đang gặp phải một vấn đề mà tôi không lường trước được.
Vì tôi mới chạy trên Linux nên tôi nghĩ tôi nên hỏi ở đây.

Vì vậy, về cơ bản, ứng dụng web cho phép người dùng tải lên tệp văn bản và sau đó ứng dụng web sẽ gửi văn bản đó đến dịch vụ web chạy trên Windows để xử lý thêm.

Đây là ý chính của nó:

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

Tôi đã mong đợi Split(Environment.NewLine) sẽ trả về hàng trăm dòng, nhưng tôi chỉ nhận được một dòng khi gọi điểm cuối từ ứng dụng web Linux.
Tôi đoán là Linux gửi các dòng mới dưới dạng \n trong khi Windows sử dụng \r\n.

Tôi đã hy vọng JSON sẽ tuần tự hóa thành \n và sau đó dịch vụ trên Windows sẽ giải tuần tự hóa nó thành \r\n.

Có lẽ tôi đã sử dụng nhiều dịch vụ chạy trên Linux và tôi chưa bao giờ phải lo lắng về các dòng mới của mình.
Tôi không muốn biết dịch vụ của mình chạy trên nền tảng gì và điều chỉnh các dòng mới cho phù hợp.
Tôi đang làm gì sai?

Ứng dụng web sử dụng .NET8 và dịch vụ web sử dụng .NET6. Cả hai đều đang chạy trong Ứng dụng web Azure.

Những gì tôi đã thử:

Rất nhiều đăng nhập để tìm ra vấn đề.
Tôi biết các giải pháp thay thế, chẳng hạn như phân tách trong ứng dụng Linux rồi gửi các dòng tới Windows hoặc phân tách trên \n thay vì Environment.NewLine.
Đã tìm kiếm trên Google nhưng không thể tìm thấy câu trả lời thực sự cho vấn đề của tôi.

Giải pháp 1

Vì bạn đang sử dụng .NET 6 nên bạn có thể thử sử dụng Phương thức MemoryExtensions.EnumerateLines[^] phương thức này sẽ xử lý cả dòng mới của Windows và Linux cho bạn.

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...
}

Hoặc bạn có thể thử Phương thức String.ReplaceLineEndings[^]mặc dù điều đó sẽ phân bổ một chuỗi mới.

Trích dẫn:

Danh sách các chuỗi dòng mới được công nhận là CR (U+000D), LF (U+000A), CRLF (U+000D U+000A), NEL (U+0085), LS (U+2028), FF (U+000C ) và PS (U+2029). Danh sách này được đưa ra bởi Tiêu chuẩn Unicode, Sec. 5.8, Khuyến nghị R4 và Bảng 5-2.

コメント

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