Pertanyaan Bagaimana cara mengembalikan HTTP 500 dari ASP.NET Core RC2 Web Api?


Kembali di RC1, saya akan melakukan ini:

[HttpPost]
public IActionResult Post([FromBody]string something)
{    
    try{
        // ...
    }
    catch(Exception e)
    {
         return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
    }
}

Di RC2, tidak ada lagi HttpStatusCodeResult, dan tidak ada yang dapat saya temukan yang memungkinkan saya mengembalikan 500 jenis IActionResult.

Apakah pendekatan sekarang sepenuhnya berbeda untuk apa yang saya minta? Apakah kita tidak lagi mencoba-masuk Controller kode? Apakah kita membiarkan kerangka kerja membuang pengecualian 500 generik kembali ke pemanggil API? Untuk pengembangan, bagaimana saya bisa melihat tumpukan eksak yang persis?


75
2018-06-13 15:17


asal


Jawaban:


Dari apa yang saya lihat ada metode pembantu di dalam ControllerBase kelas. Cukup gunakan StatusCode metode:

[HttpPost]
public IActionResult Post([FromBody] string something)
{    
    //...
    try {
        DoSomething();
    }
    catch(Exception e)
    {
         LogException(e);
         return StatusCode(500);
    }
}

Anda juga dapat menggunakan StatusCode(int statusCode, object value) membebani yang juga menegosiasikan konten.


110
2018-06-13 15:30



Anda bisa menggunakannya Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode dan Microsoft.AspNetCore.Http.StatusCodes untuk membentuk tanggapan Anda, jika Anda tidak ingin hardcode nomor tertentu.

return  StatusCode(StatusCodes.Status500InternalServerError);

59
2017-10-21 10:51



Cara yang lebih baik untuk menangani hal ini mulai dari sekarang (1.1) adalah dengan melakukan hal ini Startup.cs's Configure():

app.UseExceptionHandler("/Error");

Ini akan mengeksekusi rute untuk /Error. Ini akan menghemat Anda dari menambahkan blok coba-tangkap ke setiap tindakan yang Anda tulis.

Tentu saja, Anda harus menambahkan ErrorController yang serupa dengan ini:

[Route("[controller]")]
public class ErrorController : Controller
{
    [Route("")]
    [AllowAnonymous]
    public IActionResult Get()
    {
        return StatusCode(StatusCodes.Status500InternalServerError);
    }
}

Informasi lebih lanjut sini.


Jika Anda ingin mendapatkan data pengecualian yang sebenarnya, Anda dapat menambahkan ini ke atas Get() tepat sebelum return pernyataan.

// Get the details of the exception that occurred
var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

if (exceptionFeature != null)
{
    // Get which route the exception occurred at
    string routeWhereExceptionOccurred = exceptionFeature.Path;

    // Get the exception that occurred
    Exception exceptionThatOccurred = exceptionFeature.Error;

    // TODO: Do something with the exception
    // Log it with Serilog?
    // Send an e-mail, text, fax, or carrier pidgeon?  Maybe all of the above?
    // Whatever you do, be careful to catch any exceptions, otherwise you'll end up with a blank page and throwing a 500
}

Potongan di atas diambil dari Blog Scott Sauber.


8
2017-07-12 22:16



return StatusCode((int)HttpStatusCode.InternalServerError, e);

Seharusnya digunakan.

HttpStatusCode adalah penghitungan masuk System.Net.


4
2017-07-05 01:50



Anda dapat mengembalikan BadRequestResult atau StatusCodeResult, yaitu:

return new BadRequestResult();

atau

return new StatusCodeResult(500)

2
2018-06-13 15:35



return StatusCodes.Status500InternalServerError;

-8
2017-10-31 22:51