18

私たちの ASP.NET Core ベースの Web アプリケーションでは、次のことが必要です。特定の要求されたファイルの種類は、応答でカスタムの ContentType を取得する必要があります。たとえば.map、にマップする必要がありますapplication/json。「完全な」ASP.NET 4.x では、IIS と組み合わせて<staticContent>/<mimeMap>、これに web.config を利用することができました。この動作をカスタム ASP.NET Core ミドルウェアに置き換えたいと考えています。

そこで、次のことを試しました(簡潔にするために簡略化しています):

public async Task Invoke(HttpContext context)
{
    await nextMiddleware.Invoke(context);

    if (context.Response.StatusCode == (int)HttpStatusCode.OK)
    {
        if (context.Request.Path.Value.EndsWith(".map"))
        {
            context.Response.ContentType = "application/json";
        }
    }
}

残念ながら、context.Response.ContentType残りのミドルウェア チェーンを呼び出した後に設定しようとすると、次の例外が発生します。

System.InvalidOperationException: "Headers are read-only, response has already started."

この要件を解決するミドルウェアを作成するにはどうすればよいですか?

4

2 に答える 2

16

コールバックを使用してみてくださいHttpContext.Response.OnStarting。これは、ヘッダーが送信される前に発生する最後のイベントです。

public async Task Invoke(HttpContext context)
{
    context.Response.OnStarting((state) =>
    {
        if (context.Response.StatusCode == (int)HttpStatusCode.OK)
        {
           if (context.Request.Path.Value.EndsWith(".map"))
           {
             context.Response.ContentType = "application/json";
           }
        }          
        return Task.FromResult(0);
    }, null);

    await nextMiddleware.Invoke(context);
}
于 2016-06-20T10:20:34.797 に答える