簡體   English   中英

帶有自定義響應包裝器的 ASP.NET Core 3.1 Web API 中的 JSON 響應中斷

[英]JSON response breaks in ASP.NET Core 3.1 Web API with custom response wrapper

我正在開發一個 ASP.NET 2.2 Web API 項目,該項目使用包裝器來生成一致的響應。 經過一番搜索,我發現團隊遵循了文章“ 管理異常和一致響應的自定義包裝器”中的實現。

這按預期工作。 現在我們計划升級到 ASP.NET Core 3.1。 升級后,這不能按預期工作。 我認為這是由於 ASP.NET Core 2.2 和 3.1 之間的重大變化。 我按照 Microsoft 的Migrate from ASP.NET Core 2.2 to 3.0指南修復了所有這些問題。

現在我來自 API 的 JSON 響應中斷了。

這是響應成功時執行的代碼:

private static Task HandleSuccessRequestAsync(HttpContext context, object body, int code)  
{  
    context.Response.ContentType = "application/json";  
    string jsonString, bodyText = string.Empty;  
    APIResponse apiResponse = null;  


    if (!body.ToString().IsValidJson())  
        bodyText = JsonConvert.SerializeObject(body);  
    else  
        bodyText = body.ToString();  

    dynamic bodyContent = JsonConvert.DeserializeObject<dynamic>(bodyText);  
    Type type;  

    type = bodyContent?.GetType();  

    if (type.Equals(typeof(Newtonsoft.Json.Linq.JObject)))  
    {  
        apiResponse = JsonConvert.DeserializeObject<APIResponse>(bodyText);  
        if (apiResponse.StatusCode != code)  
            jsonString = JsonConvert.SerializeObject(apiResponse);  
        else if (apiResponse.Result != null)  
            jsonString = JsonConvert.SerializeObject(apiResponse);  
        else  
        {  
            apiResponse = new APIResponse(code, ResponseMessageEnum.Success.GetDescription(), bodyContent, null);  
            jsonString = JsonConvert.SerializeObject(apiResponse);  
        }  
    }  
    else  
    {  
        apiResponse = new APIResponse(code, ResponseMessageEnum.Success.GetDescription(), bodyContent, null);  
        jsonString = JsonConvert.SerializeObject(apiResponse);  
    }  

    return context.Response.WriteAsync(jsonString);  
}  

我調試直到它達到return context.Response.WriteAsync(jsonString); HandleSuccessRequestAsync()方法中。 一切安好。 但是 JSON 響應中斷了。

預期回應:

{  
    "Version": "1.0.0.0",  
    "StatusCode": 200,  
    "Message": "Request successful.",  
    "Result": [  
        "value1",  
        "value2"  
    ]  
}  

實際反應:

{  
    "Version": "1.0.0.0",  
    "StatusCode": 200,  
    "Message": "Request successful.",  
    "Result":   

請幫我看看我哪里出錯了? 這是因為 ASP.NET Core 3.1 升級了嗎?

我們在使用自定義中間件更改響應正文的應用程序中遇到了同樣的問題。 此頁面很有幫助:

ASP.NET Core 3.x 中響應重寫的內容注入

只要在將更改后的正文寫入響應之前將 ContentLength 更改為 null,我們就不必像上述頁面中那樣為 HttpResponse.Body 創建包裝器。 盡管 ASP.NET Core 2.2 在控制器操作返回其值並寫入響應正文時未設置 ContentLength,但了解 ASP.NET Core 3.1 確實設置了 ContentLength 是有幫助的。 結果,當我們更改響應正文時,內容變得比設置的 ContentLength 長。

我們有代碼在等待控制器操作之前用內存字符串替換響應主體。 這是為了能夠捕獲來自任何控制器方法的響應。 然后響應被改變,原始流恢復到響應對象。 然后將更改后的響應寫入到正文中,原始流就位。

發生的事情是當中間件等待控制器響應時,響應設置了 ContentLength。 然后,當我們編寫更改后的響應正文時,ContentLength 並未更新。 所以接收到的json字符串被截斷了。 我們能夠將 ContentLength 更改為更改內容的長度(或使用 null,兩者都有效),如果我們將更改的正文寫入響應之前更改長度。

暫無
暫無

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

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