Я работаю над проектом веб-API ASP.NET 2.2, который использует оболочку для получения согласованных ответов. После некоторого поиска я обнаружил, что команда следовала реализации из статьи «Пользовательская оболочка для управления исключениями и согласованными ответами».
Это работает, как ожидалось. Теперь мы планируем перейти на ASP.NET Core 3.1. После обновления это не работает должным образом. Я думаю, это произошло из-за серьезных изменений между ASP.NET Core 2.2 и 3.1. Я исправил все это после Microsoft Руководство по переходу с ASP.NET Core 2.2 на 3.0.
Теперь мой ответ JSON от API ломается.
Вот код, который запускается при успешном ответе:
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?
Result
в json не имеет данных? Согласно предоставленной вами ссылке и документу о миграции, мой проект 3.1, который был перенесен из проекта 2.2, работал хорошо, иResult
имеет значение. Если вы хотите, чтобы сообщество рассмотрело и отладило код, не могли бы вы поделиться полной демонстрацией, которая может воспроизводить проблема ? - person Xueli Chen   schedule 12.03.2020return
и пользователем? Или вы имеете в виду, что все работает нормально, кроме, что десериализация возвращает усеченный JSON? - person Jeremy Caney   schedule 05.04.2020