Mystring.split(environment.newline) विंडोज़ और लिनक्स के बीच विफल रहता है


नमस्ते,

मैंने हाल ही में एक वेब ऐप को विंडोज़ एज़्योर ऐप सर्विस से लिनक्स में माइग्रेट किया है।
मैं अब एक ऐसी समस्या से जूझ रहा हूं जिसका मैंने अनुमान नहीं लगाया था।
चूँकि मैं लिनक्स पर चलने में नया हूँ इसलिए मैंने सोचा कि मैं यहाँ पूछूँ।

तो मूल रूप से वेब ऐप उपयोगकर्ताओं को एक टेक्स्ट फ़ाइल अपलोड करने की अनुमति देता है और वेब ऐप आगे की प्रक्रिया के लिए टेक्स्ट को विंडोज़ पर चलने वाली वेब सेवा पर भेजता है।

यहाँ इसका सार है:

सी#
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);

मुझे उम्मीद थी कि स्प्लिट(एनवायरमेंट.न्यूलाइन) सैकड़ों लाइनें लौटाएगा, लेकिन जब मैं लिनक्स वेब ऐप से एंडपॉइंट पर कॉल करता हूं तो मुझे केवल एक ही मिल रहा है।
मेरा अनुमान है कि लिनक्स नई लाइनें \n के रूप में भेजता है जबकि विंडोज़ \r\n का उपयोग करता है।

मुझे उम्मीद थी कि JSON \n पर क्रमबद्ध हो जाएगा और फिर विंडोज़ पर सेवा इसे \r\n के रूप में डीक्रमीकृत कर देगी।

मैंने शायद लिनक्स पर चलने वाली बहुत सी सेवाओं का उपयोग किया है और मुझे अपनी नई लाइनों के बारे में कभी चिंता करने की ज़रूरत नहीं पड़ी।
मैं यह नहीं जानना चाहता कि मेरी सेवा किस आधार पर चलती है और मैं अपनी नई लाइनों को उसके अनुसार समायोजित करना नहीं चाहता।
मैं क्या गलत कर रहा हूं?

वेब ऐप .NET8 का उपयोग करता है और वेब सेवा .NET6 का उपयोग करती है। दोनों Azure वेब ऐप्स में चल रहे हैं।

मैंने क्या प्रयास किया है:

समस्या का पता लगाने के लिए खूब लॉगिंग करें।
मैं वर्कअराउंड के बारे में जानता हूं, जैसे लिनक्स ऐप में विभाजन करना और फिर विंडोज़ पर लाइनें भेजना, या एनवायरनमेंट.न्यूलाइन के बजाय \n पर विभाजन करना।
कुछ गूगल किया, लेकिन मेरी समस्या का कोई वास्तविक उत्तर नहीं मिल सका।

समाधान 1

चूँकि आप .NET 6 का उपयोग कर रहे हैं, आप इसका उपयोग करने का प्रयास कर सकते हैं MemoryExtensions.EnumerateLines विधि[^] विधि, जो आपके लिए विंडोज़ और लिनक्स दोनों न्यूलाइन को संभालना चाहिए।

सी#
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 विधि[^]हालाँकि वह एक नई स्ट्रिंग आवंटित करेगा।

उद्धरण:

मान्यता प्राप्त न्यूलाइन अनुक्रमों की सूची सीआर (यू+000डी), एलएफ (यू+000ए), सीआरएलएफ (यू+000डी यू+000ए), एनईएल (यू+0085), एलएस (यू+2028), एफएफ (यू+000सी) है। ), और पीएस (यू+2029)। यह सूची यूनिकोड मानक, सेक द्वारा दी गई है। 5.8, अनुशंसा आर4 और तालिका 5-2।

コメント

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