У меня есть метод веб-API, который возвращает данные в свойстве HttpResponseMessage.Content. Вот код метода:
[HttpGet]
public HttpResponseMessage MethodName()
{
try
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent("Hello WORLD", Encoding.UTF8, "application/json");
return response;
}
catch (Exception ex)
{
var response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.Content = new StringContent("{\"error\": \"" + ex.Message + "\"}", Encoding.UTF8, "application/json");
return response;
}
}
Когда я вызываю этот метод из Postman, метаданные ответа показывают, что ответ имеет длину 11, что правильно для строки «Hello WORLD». Однако я не вижу фактических данных в теле ответа.
Что мне не хватает?
Вот ответ:
{
"version": "1.1",
"content": {
"headers": [
{
"key": "Content-Type",
"value": [
"application/json; charset=utf-8"
]
},
{
"key": "Content-Length",
"value": [
"11"
]
}
]
},
"statusCode": 200,
"reasonPhrase": "OK",
"headers": [],
"trailingHeaders": [],
"requestMessage": null,
"isSuccessStatusCode": true
}
@stuartd да, я забыл удалить этот бит .. ничего плохого в том, что он помогает мне опубликовать вопрос, не так ли?





Если бы вы использовали IActionResult в качестве возвращаемого типа вашего метода, вы могли бы воспользоваться преимуществами методов Ok и StatusCode базового класса. Ваш метод можно переписать так:
[HttpGet]
public IActionResult MethodName()
{
try
{
return Ok("Hello WORLD");
}
catch (Exception ex)
{
return StatusCode((int)HttpStatusCode.InternalServerError, "{\"error\": \"" + ex.Message + "\"}") ;
}
}
Честно говоря, я не очень понимаю единственную цель вашего блока try-catch, но я надеюсь, что вы поняли суть.
ОБНОВЛЕНИЕ №1
почему я не могу установить
HttpResponseMessage.Contentправильно.
У StringContent есть единственное свойство, называемое Headers. Другими словами, значение не отображается как свойство. Популярные сериализаторы (например, Json.NET или System.Text.Json) по умолчанию сериализуют только свойства.
Если бы вы могли использовать JsonContent вместо StringContent, тогда сериализация будет работать правильно, поскольку она предоставляет Value как свойство.
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = JsonContent.Create("Hello WORLD");
var responseInJson = JsonConvert.SerializeObject(response, Formatting.Indented);
responseInJson.Dump();
{
"Version":"1.1",
"Content":{
"ObjectType":"System.String, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
"Value":"Hello WORLD",
"Headers":[
{
"Key":"Content-Type",
"Value":[
"application/json; charset=utf-8"
]
}
]
},
"StatusCode":200,
"ReasonPhrase":"OK",
"Headers":[
],
"TrailingHeaders":[
],
"RequestMessage":null,
"IsSuccessStatusCode":true
}
Связанная ссылка на скрипт dotnet: https://dotnetfiddle.net/NiM8lx
Уловка попытки заключается в том, что код был упрощен для создания этого вопроса. У меня есть некоторая логика, а затем я пытаюсь установить значение HttpResponseMessage.Content. - но то, что я пытаюсь установить, никогда не оказывается в объекте.
@AyoAdesina Хорошо, попытка поймать теперь имеет смысл. Мое предложенное решение сработало для вас?
Ваше решение - обходной путь. - и я уже использую его в своем проекте. - Это еще один способ сделать это, но на самом деле он не отвечает на мой вопрос, почему я не могу правильно установить HttpResponseMessage.Content. - Я проголосую за ваше решение, но я все еще не уверен, почему я не могу установить HttpResponseMessage.Content. Может быть что-то еще, например версия .net, версия проекта API или что-то в этом роде.
@AyoAdesina Я обновил свой пост, не могли бы вы его проверить?
Это имеет смысл... спасибо
Вот возможная перефразированная версия вашего вопроса, которую вы можете опубликовать на Stack Overflow — сильный запах ChatGPT