3 回答

TA貢獻1793條經驗 獲得超6個贊
要使這項工作成功,需要做兩件事。第一個是添加[FromBody]
到您的CspReportRequest request
參數1:
public?IActionResult?UriReport([FromBody]?CspReportRequest?request)
如果沒有[FromBody]
,JsonInputFormatter
將不會用于解析請求正文。但是,使用 后?[FromBody]
,您將開始看到415
響應。
第二件事是配置JsonInputFormatter
支持application/csp-report
媒體類型,您已經嘗試過這樣做。您的方法的問題在于,實際上有兩個配置實例JsonInputFormatter
,而您影響了錯誤的實例。如果你只是從 2 更改First()
,Last()
它應該可以工作。
為什么?集合中的第一個JsonInputFormatter
實際上是 的實例JsonPatchInputFormatter
,它擴展了JsonInputFormatter
:
public?class?JsonPatchInputFormatter?:?JsonInputFormatter
這是第一個添加的,因此它是您正在配置的。它無法處理 的實例,CspReportRequest
因為它有關于處理JsonPatchDocument<T>
等的特定規則,因此它會傳遞到第二個JsonInputFormatter
。正如我所提到的,第二個實例未配置為支持application/csp-report
,因此它也無法處理該請求。
1如果您正在使用[ApiController]
,則不需要使用[FromBody]
,但您問題中的所有內容都表明您沒有使用[ApiController]
。
2使用Last()
notFirst()
不一定是最好的方法,但它應該表明問題出在哪里。有很多方法可以獲取JsonInputFormatter
您感興趣的具體信息。

TA貢獻1801條經驗 獲得超16個贊
另一種選擇是讀取 Request.Body 來獲取報告。
不要忘記包含 Microsoft.AspNetCore.Mvc 命名空間。
[HttpPost]
public IActionResult Report()
{
var report = "";
using (var reader = new StreamReader(Request.Body))
{
report = reader.ReadToEnd();
}
_log.LogError("CSP violation: " + report);
return Ok();
}
報告變量將包含 json 報告數據。

TA貢獻1785條經驗 獲得超8個贊
.AddMvcOptions(options => {
options.InputFormatters.OfType<NewtonsoftJsonInputFormatter>()
.First(f => f.SupportedMediaTypes.Contains("application/json"))
.SupportedMediaTypes.Add("application/csp-report");
});
可能沒有,JsonInputFormatter但NewtonsoftJsonInputFormatter如果你使用.AddNewtonsoftJson()
另外,請注意第一個謂詞。關鍵是有幾個繼承自JsonInputFormatter(一個用于補?。┑母袷交绦?,并且您對已經支持的那個格式化程序感興趣application/json
- 3 回答
- 0 關注
- 184 瀏覽
添加回答
舉報