2015-10-16 7 views

Odpowiedz

19

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.

+0

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? –

+1

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. –

+0

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 –

Powiązane problemy