2016-06-20 76 views
9

在我們基於ASP.NET Core的Web應用程序中,我們需要以下內容:某些請求的文件類型應該獲得自定義ContentType的響應。例如。 .map應該映射到application/json。在「完整的」ASP.NET 4.x和IIS的組合中,可以使用web.config <staticContent>/<mimeMap>來實現這一點,我想用自定義的ASP.NET Core中間件替換這種行爲。設置響應的中間件ContentType

所以我嘗試了以下(簡化爲簡潔起見):

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." 

如何我可以創建一個解決此要求的中間件嗎?

回答

6

嘗試使用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); 
} 
1

使用OnStarting方法的重載:

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

     return Task.CompletedTask; 
    }); 

    await nextMiddleware.Invoke(context); 
}