9

Как вернуть код HttpStatus из методов API в моем ASP.NET Core 1.0, если есть проблема?Возврат HttpStatusCode в API-методе

Если метод должен возвращать определенный тип объекта, когда я пытаюсь вернуть код состояния Http, я получаю сообщение о том, что я не могу преобразовать свой объект в код состояния.

[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

ошибка правильно, вы должны рассмотреть, чтобы вернуть 'Task ' и изменить возвращение к 'вернуть Ok (MyObject);' –

+0

В WebAPI, вы бросаете исключение с определенным кодом ответа (представленный с помощью Enum). Это не позволяет исключению пузыря вверх по стеку, но просто возвращает указанный вами код состояния. 'throw new HttpResponseException (HttpStatusCode.NotFound);' – James

+0

@James Спасибо за ваш ответ, но мне трудно найти исключение HttpResponseException. Похоже, что это в System.Web.Http namesapce, но мой ASP.NET Core 1.0 даже не позволяет мне ссылаться на него. Это предполагает, что я устанавливаю этот пакет NuGet https://www.nuget.org/packages/Microsoft.AspNet.Mvc.WebApiCompatShim/. Это все еще правильный способ справиться с ним в ASP.NET Core 1.0? – Sam

ответ

9

Вернуть IActionResult от вашего действия контроллера вместо:

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

    //... 

    return Ok(myObject); 
} 

Если вместо этого вы хотите, чтобы удалить такие нулевые чеки от контроллера можно определить пользовательский атрибут:

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

Это мы не должны беспокоиться о том, что модель является нулевой в действии.

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

Благодарим вас за предложение, но я не должен был этого делать. Мне не нужно было устанавливать пакет совместимости, чтобы сделать ASP.NET Core 1.0 API более похожим на старую версию. То, что я действительно хочу узнать, это правильный способ возврата кодов HttpStatus в API ASP.NET Core 1.0. – Sam

+0

Извините, я слишком быстро ответил. Сейчас обновлено – peco

+0

Еще раз спасибо за вашу помощь. Вот где я получаю сообщение об ошибке «Не могу неявно преобразовать тип« HttpStatusCodeResult »в« SomeObject ». Это именно то, с чем я боролся. – Sam

Смежные вопросы