9

Come restituire un codice HttpStatus dai metodi API nel mio ASP.NET Core 1.0 se c'è un problema?Restituisci HttpStatusCode nel metodo API

Se il metodo deve restituire un tipo di oggetto particolare, quando si tenta di restituire un codice di stato Http, viene visualizzato un errore che indica che non è possibile convertire il mio oggetto in codice di stato.

[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

l'errore è giusto, si dovrebbe prendere in considerazione di tornare 'Task ' e cambiare il ritorno al 'tornare Ok (myObject);' –

+0

In WebAPI, è un'eccezione con un codice di risposta specifica (rappresentata da un Enum). Non lascia filtrare l'eccezione allo stack, ma restituisce semplicemente il codice di stato specificato. 'lancio nuova HttpResponseException (HttpStatusCode.NotFound);' – James

+0

@James Grazie per la tua risposta, ma sto facendo fatica a trovare HttpResponseException. Sembra che sia nella namesapce System.Web.Http ma il mio ASP.NET Core 1.0 non mi permette nemmeno di farci riferimento. Suggerisco di installare questo pacchetto NuGet https://www.nuget.org/packages/Microsoft.AspNet.Mvc.WebApiCompatShim/ Questo è ancora il modo corretto di gestirlo in ASP.NET Core 1.0? – Sam

risposta

9

restituire un IActionResult dalla tua azione di controllo, invece:

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

    //... 

    return Ok(myObject); 
} 

Se invece desidera rimuovere tali controlli nulli dal controller è possibile definire un attributo personalizzato:

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"); 
     } 
    } 
} 

Questo non dobbiamo preoccuparci che il modello sia nullo nell'azione.

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

Grazie per il tuo suggerimento ma non dovrei fare nulla di tutto ciò. Non dovrei installare un pacchetto di compatibilità per rendere l'API di ASP.NET Core 1.0 più simile alla vecchia versione. Quello che voglio davvero imparare è il modo giusto per restituire i codici HttpStatus nelle API ASP.NET Core 1.0. – Sam

+0

Scusa, ero troppo veloce per rispondere. Il suo aggiornamento ora – peco

+0

Grazie ancora per il vostro aiuto. Qui è dove viene visualizzato l'errore "Impossibile convertire in modo implicito il tipo 'HttpStatusCodeResult' in 'SomeObject'. Questo è esattamente ciò a cui mi sono confrontato. – Sam