2017-12-21 4 views
0

Ich habe eine API-Ressource, wo Sie eine neue Ressource erstellen können. Das sieht aus wie so: -ASP.Net Core Set Content-Type und Location-Header für JSON-Inhalt

[HttpPost("/content")] 
    public JsonResult PostContent([FromBody] ContentCreate content) 
    { 
     JsonResult result; 
     if (ModelState.IsValid) { 
      var newContent = _contentService.Create(content); 
      result = Json(newContent); 
      result.StatusCode = (int)HttpStatusCode.Created; 
      result.ContentType = ContentTypes.VENDOR_MIME_TYPE; 
     } 
     else { 
      var error = new ClientError(ModelState){ 
       Code = ErrorCodes.INVALID_CONTENT, 
       Description = "Content is invalid" 
      }; 
      result = Json(error); 
      result.StatusCode = (int)HttpStatusCode.BadRequest; 
      result.ContentType = ContentTypes.VENDOR_MIME_TYPE_ERROR; 
     } 

     return result; 
    } 

Dies funktioniert gut, wie es meine Anforderungen erfüllt einen 201 Status zurückzukehren, und haben einen herstellerspezifischen MIME-Typ für die Content-Type-Header. Ich möchte jedoch einen Location Header zurückgeben, der auf den Speicherort der neu erstellten Ressource zeigt. Ich bin nicht klar, wie Sie den Location-Header zur Antwort hinzufügen. Ich habe über CreatedResult gelesen, die fast perfekt aussieht. Allerdings sehe ich keine Möglichkeit, die Content-Type einzustellen, wenn ich das benutze.

Also meine Frage ist, wie gebe ich JSON, mit einem 201 Statuscode, mit einem Location Header und einem benutzerdefinierten Content-Type?

Antwort

0

Sie könnten die Kopfzeile manuell festlegen. Entweder direkt im Controller oder in einer benutzerdefinierten IActionResult-Klasse.

HttpContext.Response.Headers["Location"] = "..."; 
+0

Danke, aber ich möchte den Kontext nicht direkt ansprechen, da dies es schwierig zu testen macht. – baynezy

+0

Erstellen Sie dann Ihr eigenes benutzerdefiniertes Aktionsergebnis. Könnte sowieso eine gute Idee sein, da es den Controller ein wenig aufräumen könnte. – Allrameest

0

Sie können Ihre eigene Implementierung eines outputformatter erstellen, da Sie Json zurückgeben möchten, und nicht binäre Daten, können Sie von TextOutputFormatter (mit dem Namespace Microsoft.AspNetCore.Mvc.Formatters) abzuleiten.

Im Konstruktor dieser Klasse Sie den Inhaltstyp festlegen können Sie zurückgeben möchten: SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse(ContentTypes.VENDOR_MIME_TYPE));

Der WriteResponseBodyAsync einen Kontext-Parameter akzeptiert, können Sie diesen Parameter verwenden, können die HttpContext so zugreifen, die Sie den Location-Header festlegen zu der Antwort, und legen Sie auch den HttpStatusCode Created (201) fest.

schließlich die Formatierungs im ConfigureServices Methode registrieren, in der Startklasse, indem sie sie an die MVC-Optionen hinzugefügt:

services.AddMvc(options => 
{ 
    options.OutputFormatters.Insert(0, new MyOutputFormatter()); 
}); 

Wenn Sie hier weiter gehen müssen, sind die Microsoft-Dokumentation wirklich gut auf Dieses Thema: https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-formatters