2017-02-06 4 views
0

を続けるdosn't簡単な例は次のとおりです。 ミドルウェア:単純なミドルウェアの例。起動方法は、ここで処理

public class AuthorizationMiddleware 
{ 
    private readonly RequestDelegate _next;  
    public AuthorizationMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     if (context.Request.Headers.Keys.Contains("X-Not-Authorized")) 
     { 
      context.Response.StatusCode = 401; 
      return; 
     } 

     await _next.Invoke(context); 
    } 
} 

public class RequestHeaderMiddleware 
{ 
    private readonly RequestDelegate _next;  
    public RequestHeaderMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    }  
    public async Task Invoke(HttpContext context) 
    { 
     if (context.Request.Headers.Keys.Contains("X-Cancel-Request")) 
     { 
      context.Response.StatusCode = 500; 
      return; 
     }  
     await _next.Invoke(context); 

     // not calling 
     context.Response.Headers.Add("X-Transfer-Success", "true"); 
     await context.Response.WriteAsync("test"); 
    } 
} 

public class ProcessingTimeMiddleware 
{ 
    private readonly RequestDelegate _next;  
    public ProcessingTimeMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    }  
    public async Task Invoke(HttpContext context) 
    { 
     var watch = new Stopwatch(); 
     watch.Start(); 

     await _next(context); 

     context.Response.Headers.Add("X-Processing-Time-Milliseconds", new[] { watch.ElapsedMilliseconds.ToString() }); 
    } 
} 

登録:

app.UseMiddleware<AuthorizationMiddleware>(); 
app.UseMiddleware<RequestHeaderMiddleware>(); 
app.UseMiddleware<ProcessingTimeMiddleware>(); 
app.UseMvc(routes => 
{ 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
}); 

がなぜこのコード await context.Response.WriteAsync("test");はクラスで呼び出していないのですか? MVCを登録した場合にのみ動作します。 MVCはメソッドの実行を続行できないようにしますか?私はCで何かを逃した#?

答えて

1

ミドルウェアによっては既にレスポンスへの書き込みが開始されている場合、レスポンスヘッダの編集などはできません。これは、docsが、他のミドルウェアが実行された後(例えば、スタックの途中で、_next.Invoke()を呼び出した後にヘッダーを操作することを推奨しない理由です)。

必要な情報をログに記録する方法(キャッシュ、データベース)に記録して別の要求で表示する方法があります。

MVCを追加すると、それが送信されますMVCの後に実行されるコードが応答に書き込むことができなくなりました - 送信されました - それが送信されました -

+0

私はレスポンスヘッダが設定されていなかったと言っていなかった、私はコードが – Wachburn

+0

は、ドキュメントをチェック@Wachburn、あなたは彼が参照しているかを確認します(デバッガでこれを確認してください)すべてに寄港されていないと言います。文書の最初の警告。クライアントに既に返送されてきたレスポンスを変更しようとすると、その前の行でエラーが出るため、書き込みは呼び出していません – Nkosi

0

以下のコードを試してください:

context.Response.OnStarting(() => 
{ 
    context.Response.Headers.Add("X-Transfer-Success", "true");     
}); 

// await context.Response.WriteAsync("test"); 

await _next(context); 
関連する問題