簡體   English   中英

如何在ASP.Net Core2.2中覆蓋415響應

[英]How to Override 415 response in ASP.Net Core2.2

在.net core 2.2中,有一個默認的json,狀態代碼為415

{
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13",
   "title":"Unsupported Media Type",
   "status":415,
   "traceId":"8000003e-0001-f500-b63f-84710c7967bb"
}

我不知道這個JSON是如何產生的。 我按照下面的例子重寫json

但是我得到了不同的結果,它為原來的json添加了一個部分。 這是我的Wireshark結果

HTTP / 1.1 415不支持的媒體類型傳輸編碼:分塊

Content-Type:application / problem + json; charset = utf-8服務器:

Microsoft-IIS / 10.0 X-Powered-By:ASP.NET日期:星期一,2015年5月6日09:03:56 GMT

{
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13",
   "title":"Unsupported Media Type",
   "status":415,
   "traceId":"8000002c-0002-fb00-b63f-84710c7967bb"
}
{
   "data":"this is custom message"
}

過濾

public class MediaTypeResouceFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == 415)
        {
            var jsonString = JsonConvert.SerializeObject(new { data = "this is custom message" });
            byte[] data = Encoding.UTF8.GetBytes(jsonString);
            context.HttpContext.Response.Body.WriteAsync(data, 0, data.Length);
        }
    }
}

我不知道這個JSON是如何產生的。

[ApiController]屬性應用於控制器時,它會啟用錯誤狀態代碼的問題詳細信息 ,最終會將內置操作過濾器添加到該控制器的MVC過濾器管道中。 此操作過濾器適用於所有狀態代碼> = 400,並生成您所描述的JSON響應。

它為原來的json添加了一個部分

當您的MediaTypeResouceFilter.OnResourceExecuted代碼運行時,我上面提到的動作過濾器已經將JSON寫入正文。 您將另一個JSON格式的字符串寫入正文,只是附加並將響應修改為無效的JSON。

如果要禁用此問題,請詳細說明JSON是否為響應編寫,您可以將以下內容添加到Startup.ConfigureServices代碼中以抑制功能:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressMapClientErrors = true;
    };

看起來你只是附加到身體,並且在你的過濾器執行之前寫入身體的任何東西都留在了身體里。

如果您查看有關如何實現IResource過濾器的文檔 ,您可以使用這行代碼實現您的目標,但在OnResourceExecuting內部:

context.Result = new ContentResult()
{
    Content = jsonString
};

文件指出:

您可以通過在提供給filter方法的context參數上設置Result屬性,在任何時候使過濾器管道短路。

如果你把那些代碼放在OnResourceExecuting中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM