9

Jak mogę zwrócić kod HttpStatus z metod API w moim ASP.NET Core 1.0, jeśli wystąpił problem?Powrót HttpStatusCode w metodzie API

Jeśli metoda ma na celu zwrócić szczególną typ obiektu, gdy próbuję wrócić kod stanu HTTP, pojawia się błąd mówiąc, nie mogę przekonwertować obiekt do kodu statusu.

[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

błąd jest w porządku, należy rozważyć powrót 'Task ' i zmienić powrotu do 'powrót Ok (myObject);' –

+0

W WebAPI, to wyjątek z określonym kodem odpowiedzi (reprezentowaną przez Enum). Nie zezwala na to, aby wyjątek powodował bańki w stosie, ale po prostu zwraca podany kod statusu. 'throw new HttpResponseException (HttpStatusCode.NotFound);' – James

+0

@ James Dziękuję za odpowiedź, ale ciężko mi jest znaleźć wyjątek HttpResponseException. Wygląda na to, że znajduje się w nazwach System.Web.Http, ale mój ASP.NET Core 1.0 nawet nie pozwala mi tego odwołać. Sugeruje, żebym zainstalował ten pakiet NuGet https://www.nuget.org/packages/Microsoft.AspNet.Mvc.WebApiCompatShim/ Czy to nadal jest właściwy sposób na obsłużenie go w ASP.NET Core 1.0? – Sam

Odpowiedz

9

zwróci IActionResult z akcji kontrolera Zamiast:

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

    //... 

    return Ok(myObject); 
} 

Jeśli zamiast tego chcesz usunąć takie zerowe kontrole ze sterownika można zdefiniować atrybut niestandardowy:

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

ten tak, że nie musimy się przejmować modelem, który jest null w akcji.

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

Dziękuję za sugestię, ale nie powinienem tego robić. Nie powinienem musiał instalować pakietu kompatybilności, aby API ASP.NET Core 1.0 zachowywało się bardziej jak stara wersja. To, czego naprawdę chcę się nauczyć, to właściwy sposób zwracania kodów HttpStatus w API ASP.NET Core 1.0. – Sam

+0

Przepraszam, byłem zbyt szybki, aby odpowiedzieć. Zaktualizowany teraz – peco

+0

Jeszcze raz dziękuję za pomoc. W tym miejscu pojawia się błąd "Nie można niejawnie przekonwertować typu" HttpStatusCodeResult "na" SomeObject ".To jest dokładnie to, z czym walczyłem. – Sam