Mystring.split(environment.newline) falla entre Windows y Linux

programación


Hola a todos,

Recientemente migré una aplicación web de un servicio de aplicaciones de Windows Azure a uno de Linux.
Ahora me encuentro con un problema que no había previsto.
Como soy nuevo en Linux, pensé en preguntar aquí.

Básicamente, la aplicación web permite a los usuarios cargar un archivo de texto y luego envía el texto a un servicio web que se ejecuta en Windows para su posterior procesamiento.

Aquí está la esencia del asunto:

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

Esperaba que Split(Environment.NewLine) devolviera cientos de líneas, pero solo obtengo una cuando llamo al punto final desde la aplicación web de Linux.
Supongo que Linux envía las nuevas líneas como \n mientras que Windows usa \r\n.

Esperaba que JSON se serializara en \n y luego el servicio en Windows lo deserializara como \r\n.

Probablemente he usado muchos servicios ejecutándose en Linux y nunca tuve que preocuparme por mis nuevas líneas.
No quiero saber en qué se ejecuta mi servicio y ajustar mis nuevas líneas en consecuencia.
¿Qué estoy haciendo mal?

La aplicación web usa .NET8 y el servicio web usa .NET6. Ambos se ejecutan en Azure Web Apps.

Lo que he probado:

Un montón de registros para encontrar el problema.
Conozco soluciones alternativas, como dividir en la aplicación de Linux y luego enviar las líneas a Windows, o dividir en \n en lugar de Environment.NewLine.
Busqué en Google, pero no pude encontrar una respuesta real a mi problema.

Solución 1

Como estás usando .NET 6, puedes intentar usar el Método MemoryExtensions.EnumerateLines[^] método, que debería manejar las nuevas líneas de Windows y Linux por usted.

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

O podrías probar el Método String.ReplaceLineEndings[^]aunque eso asignaría una nueva cadena.

Cita:

La lista de secuencias de nueva línea reconocidas es CR (U+000D), LF (U+000A), CRLF (U+000D U+000A), NEL (U+0085), LS (U+2028), FF (U+000C). ), y PS (U+2029). Esta lista viene dada por el estándar Unicode, Sec. 5.8, Recomendación R4 y Tabla 5-2.

コメント

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