[ad_1]
こんにちは、みんな、
最近、Web アプリを Windows Azure App Service から Linux アプリに移行しました。
今、予想していなかった問題に直面しています。
Linux での実行が初めてなので、ここで質問しようと思いました。
したがって、基本的に、Web アプリではユーザーがテキスト ファイルをアップロードできるようになり、Web アプリはその後の処理のために Windows 上で実行されている Web サービスにテキストを送信します。
その要点は次のとおりです。
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 の両方の改行を自動的に処理します。
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]
コメント