2017-05-28 389 views
1

REST服務應提供內容協商。這意味着客戶端發送一個包含響應所需內容類型的Accept頭。如果該服務不支持此媒體類型,則應使用狀態碼406(不可接受)進行響應。ASP.NET Core中的狀態碼406(不可接受)

我嘗試將此行爲映射到ASP.NET Core。如果ASP.NET核心無法識別Accept頭中的媒體類型,則返回JSON文檔。在此框架的以前版本上述行爲可以通過增加一個特殊的輸出格式的配置來實現:

public void ConfigureServices(IServiceCollection services) { 
    services.AddMvc(options => { 
    options.OutputFormatters.Insert(0, new HttpNotAcceptableOutputFormatter()); 
    }); 
} 

不幸的是,HttpNotAcceptableOutputFormatter從RC1之後的ASP.NET核心框架去除。在當前版本的框架中是否有替代這個類的東西?

回答

4

在這種情況下,最好找到刪除功能的提交,以查看它可能被替換的提交。在這種情況下,HttpNotAcceptableOutputFormatterthis commit移除以固定issue #4612

阿爾特內容協商算法,以便它可以(經由MvcOptions)被配置爲總是遵守一個明確的Accept首部。

什麼它被替換爲MvcOptions.ReturnHttpNotAcceptable,這是對你有AddMvc加入MVC時配置MvcOptions的設置。

所以,你的代碼應該變成這樣:

services.AddMvc(options => 
{ 
    options.ReturnHttpNotAcceptable = true; 
}); 
+0

你究竟發現了什麼?! – Mardoxx

+2

@Mardoxx看着RC2分支和[找到文件](https://github.com/aspnet/Mvc/blob/1.0.0-rc2/src/Microsoft.AspNetCore.Mvc.Core/Formatters/HttpNotAcceptableOutputFormatter.cs )使用文件搜索(鍵盤快捷鍵:T)。這告訴我該文件最初位於何處。然後我去了[開發分支上的文件夾的歷史記錄](https://github.com/aspnet/Mvc/commits/dev/src/Microsoft.AspNetCore.Mvc.Core/Formatters),並使用「二進制搜索」 GitHub UI找到刪除文件的提交。 – poke

3

將此添加到Startup類中的ConfigureService方法中。

services.AddMvc(options => 
{ 
    options.ReturnHttpNotAcceptable = true; 
    // If you need to add support for XML 
    // options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()); 
}); 
0

我不得不在此之前:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
} 

然後我把它更改爲AddMvcCore(),而不是AddMvc()

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvcCore(); 
} 

最後我不得不與響應406的問題,所以我所做的就是添加.AddJsonFormatters()services.AddMVCCore(),我的API再次運行。

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvcCore() 
     .AddJsonFormatters(); 
}