ホームページ > バックエンド開発 > C++ > ASP.NET Core で Response.Body を読み取るための、MemoryStream スワッピングを使用するより効率的な方法はありますか?

ASP.NET Core で Response.Body を読み取るための、MemoryStream スワッピングを使用するより効率的な方法はありますか?

Linda Hamilton
リリース: 2025-01-08 16:16:50
オリジナル
851 人が閲覧しました

ASP.NET Core の Response.Body の効率的な読み取り: MemoryStream スワッピングの代替手段

読み取り専用ストリームである ASP.NET Core で Response.Body にアクセスすることには課題が伴います。 MemoryStream と交換するのが一般的な回避策ですが、最適ではありません。この記事では、より効率的な代替手段を検討します。

Is there a more efficient way to read Response.Body in ASP.NET Core than using MemoryStream swapping?

問題: ASP.NET Core でパフォーマンスを最適化するために設計された読み取り専用であるため、Response.Body を直接読み取ることには問題があります。

非効率な解決策 (MemoryStream スワッピング): 従来のアプローチでは、Response.BodyMemoryStream に置き換え、コンテンツを読み取り、元のストリームを復元します。 これはリソースを大量に消費し、パフォーマンスに影響を与える可能性があります。

より良いアプローチ:

MemoryStream スワッピングは機能しますが、最も効率的な方法ではありません。 次の代替案を検討してください:

  1. レスポンスボディ巻き戻しミドルウェアの使用: カスタム ミドルウェアは、よりクリーンで保守しやすいソリューションを提供します。このミドルウェアは応答をインターセプトし、Response.Body を一時的に MemoryStream にリダイレクトし、コンテンツを読み取り、元のストリームを復元します。 これにより、ストリーム操作ロジックがミドルウェア内で分離された状態になります。 簡略化した例を次に示します:
<code class="language-csharp">public class ResponseRewindMiddleware
{
    private readonly RequestDelegate _next;

    public ResponseRewindMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var originalBody = context.Response.Body;
        using var memoryStream = new MemoryStream();
        context.Response.Body = memoryStream;

        await _next(context);

        memoryStream.Seek(0, SeekOrigin.Begin);
        using var reader = new StreamReader(memoryStream);
        string responseBody = await reader.ReadToEndAsync();

        memoryStream.Seek(0, SeekOrigin.Begin);
        await memoryStream.CopyToAsync(originalBody);
        context.Response.Body = originalBody;
    }
}</code>
ログイン後にコピー
  1. 応答キャッシュの活用 (該当する場合): 応答コンテンツが静的であるか、頻繁にアクセスされる場合は、応答キャッシュの実装を検討してください。これにより、Response.Body.
  2. の繰り返しの読み取りと処理が回避されます。

重要な考慮事項:

  • パフォーマンスへの影響: Response.Body をインターセプトして操作するメソッドでは、パフォーマンスに多少のオーバーヘッドが発生します。これらのテクニックは慎重に、絶対に必要な場合にのみ使用してください。
  • エラー処理: 例外によるアプリケーションの中断を防ぐには、堅牢なエラー処理 (try-catch ブロックなど) が重要です。
  • 代替案: ストリーム操作に頼る前に、専用のロギング メカニズムを使用したり、本文全体ではなく応答ヘッダーにアクセスしたりするなど、他の方法で目的を達成できるかどうかを検討してください。

ミドルウェアまたは応答キャッシュを (適切な場合) 使用することにより、直接 Response.Body スワッピング手法と比較して MemoryStream の読み取り効率を大幅に向上させることができます。 これらのソリューションを実装する前に、パフォーマンスへの影響を慎重に比較検討してください。

以上がASP.NET Core で Response.Body を読み取るための、MemoryStream スワッピングを使用するより効率的な方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート