9

Wie gebe ich einen HttpStatus-Code von API-Methoden in meinem ASP.NET Core 1.0 zurück, wenn ein Problem vorliegt?Rückgabe HttpStatusCode in API-Methode

Wenn die Methode einen bestimmten Objekttyp zurückgeben soll, wenn ich versuche, einen HTTP-Statuscode zurückzugeben, bekomme ich eine Fehlermeldung, dass ich mein Objekt nicht in Statuscode konvertieren kann.

[HttpPost] 
public async Task<SomeObject> Post([FromBody] inputData) 
{ 
    // I detect an error and want to return BadRequest HttpStatus 
    if(inputData == null) 
     return new HttpStatusCode(400); 

    // All is well, so return the object 
    return myObject; 
} 
+0

der Fehler richtig ist, sollten Sie erwägen, 'Aufgabe zurückzukehren ' und die Rückkehr zu ändern 'Rückkehr Ok (myObject);' –

+0

In WebAPI, eine Ausnahme mit einem bestimmten Antwortcode werfen (dargestellt von einem Enum). Es lässt die Ausnahme nicht über den Stapel sprudeln, sondern gibt einfach den von Ihnen angegebenen Statuscode zurück. 'throw new HttpResponseException (HttpStatusCode.NotFound);' – James

+0

@James Vielen Dank für Ihre Antwort, aber es fällt mir schwer, die HttpResponseException zu finden. Sieht aus, als wäre es in der System.Web.Http-Namesapce, aber mein ASP.NET Core 1.0 lässt mich nicht einmal darauf verweisen. Es empfiehlt sich, dieses NuGet-Paket https://www.nuget.org/packages/Microsoft.AspNet.Mvc.WebApiCompatShim/ zu installieren. Ist dies immer noch der richtige Weg, um es in ASP.NET Core 1.0 zu handhaben? – Sam

Antwort

9

Return ein IActionResult von Ihrem Controller-Aktion statt:

public async Task<IActionResult> Post([FromBody] InputData inputData) 
{ 
    if(inputData == null) 
    { 
     return new HttpStatusCodeResult((int) HttpStatusCode.BadRequest); 
    } 

    //... 

    return Ok(myObject); 
} 

Wenn Sie stattdessen solche null Kontrollen von der Steuerung entfernen möchten Sie ein benutzerdefiniertes Attribut definieren könnte:

public class CheckModelForNullAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (context.ActionArguments.Any(k => k.Value == null)) 
     { 
      context.Result = new BadRequestObjectResult("The model cannot be null"); 
     } 
    } 
} 

Diese So müssen wir uns nicht darum kümmern, dass das Modell in der Aktion null ist.

[HttpPost] 
[CheckModelForNull] 
public async Task<SomeObject> Post([FromBody]InputData inputData) 
{ 
    // My attribute protects me from null 
    // ... 
    return myObject; 
} 
+0

Vielen Dank für Ihren Vorschlag, aber ich sollte nichts davon tun müssen. Ich sollte nicht ein Kompatibilitätspaket installieren müssen, damit ASP.NET Core 1.0 API sich mehr wie die alte Version verhält. Was ich wirklich lernen möchte, ist der richtige Weg, um HttpStatus-Codes in ASP.NET Core 1.0-APIs zurückzugeben. – Sam

+0

Sorry, ich war zu schnell um zu antworten. Es ist jetzt aktualisiert – peco

+0

Nochmals vielen Dank für Ihre Hilfe. Hier bekomme ich den Fehler "Kann den Typ 'HttpStatusCodeResult' nicht implizit in 'SomeObject' konvertieren. Das ist genau das, womit ich gekämpft habe. – Sam