Mystring.split (environment.newline) échoue entre Windows et Linux

la programmation


Salut tout le monde,

J’ai récemment migré une application Web d’un service d’application Windows Azure vers une application Linux.
Je suis maintenant confronté à un problème que je n’avais pas prévu.
Comme je suis nouveau sur Linux, j’ai pensé demander ici.

Donc, fondamentalement, l’application Web permet aux utilisateurs de télécharger un fichier texte et l’application Web envoie ensuite le texte à un service Web exécuté sous Windows pour un traitement ultérieur.

En voici l’essentiel :

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

Je m’attendais à ce que Split(Environment.NewLine) renvoie des centaines de lignes, mais je n’en reçois qu’une lorsque j’appelle le point de terminaison depuis l’application Web Linux.
Je suppose que Linux envoie les nouvelles lignes sous la forme \n tandis que Windows utilise \r\n.

J’avais espéré que le JSON serait sérialisé en \n, puis le service sous Windows le désérialiserait en \r\n.

J’ai probablement utilisé de nombreux services fonctionnant sous Linux et je n’ai jamais eu à me soucier de mes nouvelles lignes.
Je ne veux pas savoir sur quoi fonctionne mon service et ajuster mes nouvelles lignes en conséquence.
Qu’est-ce que je fais mal?

L’application Web utilise .NET8 et le service Web utilise .NET6. Les deux fonctionnent dans Azure Web Apps.

Ce que j’ai essayé :

Beaucoup de journalisation pour trouver le problème.
Je connais des solutions de contournement, comme le fractionnement dans l’application Linux, puis l’envoi des lignes à Windows, ou le fractionnement sur \n au lieu de Environment.NewLine.
J’ai fait quelques recherches sur Google, mais je n’ai pas trouvé de réponse réelle à mon problème.

Solution 1

Puisque vous utilisez .NET 6, vous pouvez essayer d’utiliser le Méthode MemoryExtensions.EnumerateLines[^] méthode, qui devrait gérer les nouvelles lignes Windows et Linux pour vous.

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

Ou tu pourrais essayer le Méthode String.ReplaceLineEndings[^]bien que cela allouerait une nouvelle chaîne.

Citation:

La liste des séquences de nouvelle ligne reconnues est CR (U+000D), LF (U+000A), CRLF (U+000D U+000A), NEL (U+0085), LS (U+2028), FF (U+000C). ), et PS (U+2029). Cette liste est donnée par la norme Unicode, Sec. 5.8, recommandation R4 et tableau 5-2.

コメント

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