Można pisać do strumienia Response.Body
bezpośrednio (jako Body
to zwykły stary System.IO.Stream
) i ręcznie ustawić typ zawartości:
public async Task ContentAction()
{
var jsonString = "{\"foo\":1,\"bar\":false}";
byte[] data = Encoding.UTF8.GetBytes(jsonString);
Response.ContentType = "application/json";
await Response.Body.WriteAsync(data, 0, data.Length);
}
Można zaoszczędzić trochę kłopotów przy użyciu niektórych narzędzi z Microsoft.AspNet.Http
:
- Metoda rozszerzenia
WriteAsync
do zapisywania zawartości ciągu znaków w treści odpowiedzi.
- Klasa
MediaTypeHeaderValue
do określania nagłówka typu zawartości. (Robi kilka walidacji i posiada API do dodawania dodatkowych parametrów takich jak charset)
Tak samo działanie będzie wyglądać następująco:
public async Task ContentAction()
{
var jsonString = "{\"foo\":1,\"bar\":false}";
Response.ContentType = new MediaTypeHeaderValue("application/json").ToString();
await Response.WriteAsync(jsonString, Encoding.UTF8);
}
W razie wątpliwości zawsze można rzucić okiem Pod implementacja ContentResult
i/lub JsonResult
.
Dziękuję za odpowiedź. A co z ustawieniami formatów json? czy możemy zastosować ten sam wzorzec co poprzednio, w którym określamy ustawienia formatyzatora w klasie uruchamiania? –
Zależy od tego, który formatter używasz, ale jeśli spojrzysz na implementację JsonResult, zobaczysz, że używają one 'context.HttpContext.RequestServices.GetRequiredService>()'. Oznacza to, że umożliwiają zdefiniowanie opcji w wbudowanym kontenerze DI (prawdopodobnie w klasie uruchamiania), a te opcje zostaną użyte w procesie formatowania. Ponieważ nie chcesz używać wbudowanego 'JsonResult', możesz zaimplementować coś własnego według tego samego pomysłu. –
masz na myśli sformatować mój json, zanim użyję go w writeAsync? oczywiście sformatuj go z ustawieniami, które mogę uzyskać z DI –