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 關注
- 204 瀏覽
添加回答
舉報
