В некоторых случаях у меня есть NewtonSoft JSON.NET, и в моем контроллере я просто возвращаю Jobject из своего контроллера, и все хорошо.
Но у меня есть случай, когда я получаю необработанный JSON из другой службы и мне нужно вернуть его из моего webAPI. В этом контексте я не могу использовать NewtonSOft, но если бы я мог, я бы создал JOBJECT из строки (что кажется ненужными накладными расходами на обработку) и вернул бы его, и все было бы в порядке с миром.
Однако я хочу просто вернуть это, но если я верну строку, то клиент получит оболочку JSON с моим контекстом в виде закодированной строки.
Как я могу явно вернуть JSON из моего метода контроллера WebAPI?
источник
HttpResponseMessage response
, а затем назначитьStringContent
его.Content
свойству. Это не сработает, если вы назначите StringContent в конструкторе.Вот решение @ carlosfigueira, адаптированное для использования интерфейса IHttpActionResult, представленного с WebApi2:
public IHttpActionResult Get() { string yourJson = GetJsonFromSomewhere(); if (string.IsNullOrEmpty(yourJson)){ return NotFound(); } var response = this.Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json"); return ResponseMessage(response); }
источник
Если вы специально хотите вернуть только этот JSON, без использования функций WebAPI (например, разрешения XML), вы всегда можете писать прямо в вывод. Предполагая, что вы размещаете это с помощью ASP.NET, у вас есть доступ к
Response
объекту, поэтому вы можете записать его таким образом в виде строки, тогда вам фактически не нужно ничего возвращать из вашего метода - вы уже написали текст ответа на выходной поток.источник
пример примера для возврата данных json из метода GET веб-API
[HttpGet] public IActionResult Get() { return Content("{\"firstName\": \"John\", \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\", \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\"); }
источник
они также работают:
[HttpGet] [Route("RequestXXX")] public ActionResult RequestXXX() { string error = ""; try{ _session.RequestXXX(); } catch(Exception e) { error = e.Message; } return new JsonResult(new { error=error, explanation="An error happened"}); } [HttpGet] [Route("RequestXXX")] public ActionResult RequestXXX() { string error = ""; try{ _session.RequestXXX(); } catch(Exception e) { error = e.Message; } return new JsonResult(error); }
источник
У меня это работает в .NET Core 3.1.
private async Task<ContentResult> ChannelCosmicRaysAsync(HttpRequestMessage request) { // client is HttpClient using var response = await client.SendAsync(request).ConfigureAwait(false); var responseContentString = await response.Content.ReadAsStringAsync().ConfigureAwait(false); Response.StatusCode = (int)response.StatusCode; return Content(responseContentString, "application/json"); }
public Task<ContentResult> X() { var request = new HttpRequestMessage(HttpMethod.Post, url); (...) return ChannelCosmicRaysAsync(request); }
ContentResult
естьMicrosoft.AspNetCore.Mvc.ContentResult
.Обратите внимание, это не заголовки каналов, но в моем случае это то, что мне нужно.
источник