【解決方法】Windows と Linux の間で Mystring.split(environment.newline) が失敗する

プログラミングQA

[ad_1]

こんにちは、みんな、

最近、Web アプリを Windows Azure App Service から 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 アプリからエンドポイントを呼び出したときに返されるのは 1 行だけです。
私の推測では、Windows は \r\n を使用するのに対し、Linux は改行を \n として送信すると思います。

JSON が \n にシリアル化され、Windows 上のサービスが \r\n として逆シリアル化することを期待していました。

私はおそらく、Linux 上で動作する多くのサービスを使用してきましたが、新しい行について心配する必要はありませんでした。
自分のサービスが何で実行されているかを知りたくないので、それに応じて新しい行を調整したいのです。
私の何が間違っているのでしょうか?

Web アプリは .NET8 を使用し、Web サービスは .NET6 を使用します。 どちらも Azure Web Apps で実行されています。

私が試したこと:

問題を見つけるために大量のログを記録します。
Linux アプリで分割して Windows に行を送信する、Environment.NewLine の代わりに \n で分割するなどの回避策は知っています。
いくつかグーグルで調べましたが、私の問題に対する実際の答えは見つかりませんでした。

解決策 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。

[ad_2]

コメント

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