2016-04-29 10 views
0

私は.NET 5/Coreで作業しており、.NET Coreの基礎(以下のコード)を理解するために最も基本的なASP.NET Core Webアプリケーションを作成しましたが、プロパティは静的フィールドのように動作し、HTTPリクエスト間でその値を保持します。私はなぜ、どのようにこれを最も簡単な方法で解決するのか、そして複数のソリューション/アプローチがあるのか​​を理解したいと思います。複数のリクエストを混在させた基本.NETコアアプリケーション

「出力」文字列をプライベート非静的フィールドとして宣言していますが、新しいHTTPリクエストごとにリセットする必要があると仮定していますが、静的フィールド/プロパティのように動作し、以前の値を保持して新しい値を追加します。 例えば、Webページが最初に出力/を示しているが、ページのカップルを更新した後、私は次の5つの出力を参照してくださいより多くの時間が

/ 
/favicon.ico 
/
/favicon.ico 
/

favicon.icoが問題ではないと私は私のウェブブラウザがそれを要求していることを理解合併。上記の出力は、最初の3ページのリフレッシュ後に表示されますが、Webブラウザが2つのHTTPリクエストを送信するため、追加のページリフレッシュごとに2つ以上のラインが出力されます。 services.AddScopedまたはservices.AddTransientを使用して解決策を思いつくかもしれませんが、各HTTP要求が別々に処理されているように見えるため、なぜサービスが必要になるのかわからないので、私のRequestHandlerクラスを再初期化する必要があります。私は単純なものを見逃していますか?サンプルコードのシンプルさのレベルでこれを処理する方法はありますか?

私の全体のアプリは以下Startup.csで構成されています

using System.Threading.Tasks; 
using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Http; 

namespace BasicApp 
{ 
    public class Startup 
    { 
     public static void Main() 
     { 
     } 

     public void Configure(IApplicationBuilder app) 
     { 
      app.UseMiddleware<RequestHandler>(); 
     } 
    } 

    public class RequestHandler 
    { 
     RequestDelegate _next; 
     private string Output = ""; 

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

     public async Task Invoke(HttpContext context) 
     { 
      Output += context.Request.Path + "\n"; 
      await context.Response.WriteAsync(Output); 
     } 
    } 
} 
+0

あなたの質問は何ですか?私はここで何が起こりたいのか、具体的には明確ではありません。 –

+0

私は個人的な出力フィールド/プロパティが静的フィールドのように振る舞わないと思います。したがって、新しいHTTPリクエストごとに値を初期化してリセットする必要があります。私はそれを静的と宣言しませんでしたが、それは静的であったようにHTTPリクエスト間でその値を保持します。つまり、初期化されず、新しいHTTPリクエストごとに値をリセットしないミドルウェアに頼ることはできません。 –

+0

簡単に言うと、.NETが新しいHTTPリクエストごとに自分のRequestHandlerミドルウェアクラスを自動的に初期化しないのはなぜですか?最も基本的な方法でHTTPリクエストごとに自動的に初期化する方法を理解しようとしています。 –

答えて

3

ミドルウェアのクラスだけIApplicationBuilder.UseMiddleware{T}を通じて一度インスタンス化し、要求パイプラインに入れています。 ASP.NET documentation on thisは、プロセスを説明するのに非常に良い仕事をしています。

あなたはIApplicationBuilder.Runメソッドを介して簡単な応答を実現することができます:

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
    } 

    public void Configure(IApplicationBuilder app) 
    { 
     app.UseMiddleware<RequestHandlerMiddleware>(); 
    } 

    public static void Main(string[] args) => WebApplication.Run<Startup>(args); 
} 

public class RequestHandlerMiddleware 
{ 
    RequestDelegate _next; 

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

    public async Task Invoke(HttpContext context) 
    { 
     var handler = new RequestHandler(); 
     await handler.HandleRequestAsync(context); 
     await _next.Invoke(context); // invoke the next delegate in the pipeline 
    } 
} 

public class RequestHandler 
{ 
    private string Output = ""; 

    public async Task HandleRequestAsync(HttpContext context) 
    { 
     Output += context.Request.Path + "\n"; 
     await context.Response.WriteAsync(Output); 
    } 
} 
:考えてもう一つの方法は、ミドルウェアのクラスは、各要求を使用して RequestHandlerをインスタンス化していることだろう

public void Configure(IApplicationBuilder app) 
{ 
    app.Run(async context => 
    { 
     await context.Response.WriteAsync(context.Request.Path); 
    }); 
} 

+0

ありがとうございます。 'Run'を使った最初の例はうまくいくかもしれませんが、インスタンス化/値のリセットを示すようではないので、後でテストする必要があります。 2番目の例とミドルウェアクラスが一度だけインスタンス化されるという説明 - 私の問題に対処します。私はミドルウェアがそれぞれのHTTP要求に対して「新鮮な」状態になるはずだと思っていたと思いますが、今から別のクラスをインスタンス化する必要があるかもしれません。 –

関連する問題