فشل Mystring.split(environment.newline) بين نظامي التشغيل Windows وLinux

برمجة


أهلاً بكم،

لقد قمت مؤخرًا بترحيل تطبيق ويب من خدمة تطبيقات Windows Azure إلى تطبيق Linux.
أنا الآن أواجه مشكلة لم أتوقعها.
وبما أنني جديد على نظام التشغيل Linux، اعتقدت أنني سأسأل هنا.

لذا، يسمح تطبيق الويب للمستخدمين بتحميل ملف نصي ثم يرسل تطبيق الويب النص إلى خدمة ويب تعمل على نظام Windows لمزيد من المعالجة.

وهنا جوهر ذلك:

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

كنت أتوقع أن يقوم Split(Environment.NewLine) بإرجاع مئات الأسطر، لكنني أحصل على سطر واحد فقط عندما أتصل بنقطة النهاية من تطبيق الويب Linux.
أعتقد أن Linux يرسل الأسطر الجديدة كـ \n بينما يستخدم Windows \r\n.

كنت أتمنى أن يتم إجراء تسلسل لـ JSON إلى \n ثم تقوم الخدمة الموجودة على Windows بإلغاء تسلسله كـ \r\n.

من المحتمل أنني استخدمت الكثير من الخدمات التي تعمل على نظام التشغيل Linux ولم أشعر أبدًا بالقلق بشأن خطوطي الجديدة.
لا أريد أن أعرف ما الذي تعمل عليه خدمتي وأقوم بتعديل خطوطي الجديدة وفقًا لذلك.
ما الخطأ الذي افعله؟

يستخدم تطبيق الويب .NET8 وتستخدم خدمة الويب .NET6. كلاهما يعمل في Azure Web Apps.

ما حاولت:

الكثير من التسجيل للعثور على المشكلة.
أعرف بعض الحلول، مثل التقسيم في تطبيق Linux ثم إرسال الخطوط إلى Windows، أو التقسيم على \n بدلاً من Environment.NewLine.
لقد قمت ببعض البحث على Google، لكن لم أتمكن من العثور على إجابة فعلية لمشكلتي.

الحل 1

نظرًا لأنك تستخدم .NET 6، يمكنك تجربة استخدام طريقة MemoryExtensions.EnumerateLines[^] الطريقة التي يجب أن تتعامل مع الخطوط الجديدة لنظامي التشغيل Windows و Linux نيابةً عنك.

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

أو يمكنك تجربة طريقة String.ReplaceLineEndings[^]، على الرغم من أن ذلك من شأنه تخصيص سلسلة جديدة.

يقتبس:

قائمة تسلسلات الأسطر الجديدة المعترف بها هي CR (U+000D)، LF (U+000A)، CRLF (U+000D U+000A)، NEL (U+0085)، LS (U+2028)، FF (U+000C) )، وPS (U+2029). يتم تقديم هذه القائمة بواسطة Unicode Standard، Sec. 5.8، التوصية R4 والجدول 5-2.

コメント

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