Mystring.split(environment.newline) 在 windows 和 linux 之间失败

编程


大家好,

我最近将一个 Web 应用程序从 Windows Azure 应用服务迁移到 Linux 应用服务。
我现在遇到了一个我没有预料到的问题。
由于我是在 Linux 上运行的新手,我想我应该在这里问。

因此,基本上,Web 应用程序允许用户上传文本文件,然后 Web 应用程序将文本发送到 Windows 上运行的 Web 服务以进行进一步处理。

这是它的要点:

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

我预计 Split(Environment.NewLine) 将返回数百行,但当我从 Linux Web 应用程序调用端点时,我只得到一行。
我的猜测是 Linux 将新行发送为 \n,而 Windows 使用 \r\n。

我原本希望 JSON 能够序列化为 \n,然后 Windows 上的服务会将其反序列化为 \r\n。

我可能使用过很多在 Linux 上运行的服务,而且我从来不用担心我的新线路。
我不想知道我的服务在什么上运行并相应地调整我的新线路。
我究竟做错了什么?

Web 应用程序使用 .NET8,Web 服务使用 .NET6。 两者都在 Azure Web Apps 中运行。

我尝试过的:

大量的日志记录来发现问题。
我知道一些解决方法,例如在 Linux 应用程序中拆分,然后将行发送到 Windows,或者在 \n 而不是 Environment.NewLine 上拆分。
进行了一些谷歌搜索,但找不到我的问题的实际答案。

解决方案1

由于您使用的是 .NET 6,因此您可以尝试使用 MemoryExtensions.EnumerateLines 方法[^] 方法,它应该为您处理 Windows 和 Linux 换行符。

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

或者你可以尝试 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 标准第 2 节给出。 5.8、建议 R4 和表 5-2。

コメント

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