এএসপি.নেট কোর আরসি 2 ওয়েব অপি থেকে কীভাবে এইচটিটিপি 500 ফিরিয়ে আনবেন?


187

আরসি 1 এ ফিরে, আমি এটি করব:

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

আরসি 2-তে, এইচটিটিপিস্ট্যাটাসকোডরেসাল্ট আর নেই এবং আমি খুঁজে পাবার মতো কিছুই নেই যা আমাকে 500 ধরণের আইএ্যাকশনআরসাল্ট ফিরে দিতে দেয়।

আমি যা জিজ্ঞাসা করছি তার জন্য কি এখন দৃষ্টিভঙ্গি সম্পূর্ণ ভিন্ন? আমরা কি আর Controllerকোডে চেষ্টা করি না ? আমরা কী ফ্রেমওয়ার্কটি একটি সাধারণ 500 ব্যতিক্রমটি API কলারের কাছে ফিরিয়ে দিতে পারি? বিকাশের জন্য, আমি কীভাবে সঠিক ব্যতিক্রম স্ট্যাক দেখতে পারি?

উত্তর:


238

আমি যা দেখতে পাচ্ছি তার থেকে ControllerBaseক্লাসের অভ্যন্তরে সহায়ক পদ্ধতি রয়েছে । কেবল StatusCodeপদ্ধতিটি ব্যবহার করুন :

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

আপনি StatusCode(int statusCode, object value)ওভারলোডও ব্যবহার করতে পারেন যা সামগ্রীতে আলোচনাও করে।


7
এটি করার ফলে আমরা সিওআরএস শিরোলেখগুলি হারাব, সুতরাং ব্রাউজার ক্লায়েন্টদের থেকে ত্রুটিগুলি লুকানো রয়েছে। ভি হতাশাজনক।
বিবিসিমোনবিবি

2
@bbsimonbb অভ্যন্তরীণ ত্রুটিগুলি ক্লায়েন্টদের থেকে আড়াল করা উচিত। তারা ডেভেলপারদের জন্য লগ করা উচিত।
হিমালয় গার্গ

10
কোন স্তরের ত্রুটি তথ্য ফিরে আসে তা চয়ন করার জন্য বিকাশকারীদের traditionতিহ্যগতভাবে উপভোগ করা উচিত।
bbsimonbb

177

আপনি নির্দিষ্ট নম্বরগুলি হার্ডকোড করতে না চাইলে আপনি ব্যবহার করতে পারেন Microsoft.AspNetCore.Mvc.ControllerBase.StatusCodeএবং Microsoft.AspNetCore.Http.StatusCodesআপনার প্রতিক্রিয়া তৈরি করতে পারেন।

return  StatusCode(StatusCodes.Status500InternalServerError);

আপডেট: আগস্ট 2019

সম্ভবত মূল প্রশ্নের সাথে সরাসরি সম্পর্কিত নয় তবে একই ফলাফল অর্জনের চেষ্টা করার সাথে Microsoft Azure Functionsআমি জানতে পারি যে আমাকে StatusCodeResultঅ্যাসেমব্লিতে পাওয়া একটি নতুন অবজেক্ট তৈরি করতে হয়েছিল Microsoft.AspNetCore.Mvc.Core। আমার কোডটি এখন এ জাতীয় দেখাচ্ছে;

return new StatusCodeResult(StatusCodes.Status500InternalServerError);

11
দুর্দান্ত একটি, কোনও হার্ডকোডযুক্ত অংশ / "ম্যাজিক নম্বর" এড়িয়ে চলে। আমি এর আগে স্ট্যাটাসকোড ((ইনট্রি) এইচটিপিস্ট্যাটাসকোড.ইনটার্নার সার্ভারেরর) ব্যবহার করেছি তবে আমি তোমার চেয়ে ভাল পছন্দ করি।
অ্যালোর

1
একটা জিনিস আমি সেই সময়ে বিবেচনা করি নি তা হ'ল কোডটি আরও পঠনযোগ্য করে তোলে, এটির ফিরে এসে আপনি জানেন যে 500 নম্বর ত্রুটিটি কী সম্পর্কিত, কোডে এটি ঠিক আছে। স্ব ডকুমেন্টিং :-)
এডওয়ার্ড কমা

11
আমি শীঘ্রই যে কোনও সময় অভ্যন্তরীণ সার্ভার ত্রুটি (500) পরিবর্তনের কল্পনা করতে পারি না।
রোলস

2
অসাধারণ. এটি সত্যিই আমার অবিশ্বাস্য বৈশিষ্ট্যগুলিও পরিষ্কার করে। উদা: [প্রোসেসস রেসপন্সটাইপ (স্ট্যাটাস কোডস.স্ট্যাটাস 500 ইনটার্নাল সার্ভারেরর))
redwards510

43

আপনার প্রতিক্রিয়াতে যদি আপনার কোনও শরীরের প্রয়োজন হয় তবে আপনি কল করতে পারেন

return StatusCode(StatusCodes.Status500InternalServerError, responseObject);

এটি প্রতিক্রিয়া অবজেক্টের সাথে 500 ফিরিয়ে দেবে ...


3
আপনি যদি কোনও নির্দিষ্ট প্রতিক্রিয়া অবজেক্টের ধরণ তৈরি করতে না চান: return StatusCode(StatusCodes.Status500InternalServerError, new { message = "error occurred" });এবং অবশ্যই আপনি নিজের পছন্দ মতো বর্ণনামূলক বার্তা এবং অন্যান্য উপাদানও যুক্ত করতে পারেন।
মাইক টাভের্ন

18

একটি ভাল উপায় এখন এই হ্যান্ডেল করতে (1.1) এ এই কাজ করতে হয় Startup.cs'র Configure():

app.UseExceptionHandler("/Error");

এটি এর জন্য রুটটি কার্যকর করবে /Error। এটি আপনার লেখার প্রতিটি ক্রিয়ায় ট্রাই-ক্যাচ ব্লক যুক্ত করা থেকে রক্ষা করবে।

অবশ্যই, আপনার এটির মতো একটি ত্রুটি নিয়ন্ত্রণকারী যুক্ত করতে হবে:

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

আরও তথ্য এখানে


আপনি যদি প্রকৃত ব্যতিক্রম ডেটা পেতে চান তবে আপনি বিবৃতি Get()দেওয়ার আগে উপরের ডানদিকে এটি যুক্ত করতে পারেন return

// 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
}

স্কট সাউবারের ব্লগ থেকে নেওয়া স্নিপেটের উপরে ।


এটি দুর্দান্ত, তবে নিক্ষেপ করা ব্যতিক্রমটি কীভাবে লগ করব?
redwards510

@ redwards510 আপনি এটি কীভাবে করবেন তা এখানে: scottsauber.com/2017/04/03/… আমি এটির প্রতিফলিত করতে আমার উত্তর আপডেট করব, যেহেতু এটি একটি সাধারণ ব্যবহারের ঘটনা 😊
gldraphael

@gldraphael আমরা বর্তমানে কোর 2.1 ব্যবহার করছি। স্কটের ব্লগ দুর্দান্ত, তবে আমি যদি জানতে চাই যে আমি এক্সেক্সসেপহ্যান্ডলারপ্যাথফিউচারটি বর্তমানে প্রস্তাবিত সেরা অনুশীলন। সম্ভবত কাস্টম মিডলওয়্যার তৈরি করা ভাল?
পাভেল

@ পাভেল আমরা ExceptionHandlerমিডলওয়্যারটি এখানে ব্যবহার করছি। আপনি অবশ্যই যথাযথভাবে নিজের মতো রোল করতে পারেন বা এটি প্রসারিত করতে পারেন। সূত্রের লিঙ্কটি এখানে । সম্পাদনা: এর জন্য এই লাইনটি দেখুনIExceptionHandlerPathFeature
gldraphael

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

নন-এএসপি.নেট প্রসঙ্গে ব্যবহার করা উচিত (এএসপি.নেট কোরের অন্যান্য উত্তর দেখুন)।

HttpStatusCodeএকটি গণনা হয় System.Net


11

কীসের মতো কোনও অভ্যন্তরীণ সার্ভার ত্রুটি উপস্থাপন করে এমন একটি কাস্টম অবজেক্টসেসল্ট শ্রেণি তৈরি সম্পর্কে কীভাবে OkObjectResult? আপনি নিজের বেস ক্লাসে একটি সহজ পদ্ধতি স্থাপন করতে পারেন যাতে আপনি সহজেই অভ্যন্তরীণ সার্ভারেরিয়ার তৈরি করতে পারেন এবং ঠিক যেমন করেন Ok()বা ঠিক তেমন ফিরিয়ে আনতে পারেন BadRequest()

[Route("api/[controller]")]
[ApiController]
public class MyController : MyControllerBase
{
    [HttpGet]
    [Route("{key}")]
    public IActionResult Get(int key)
    {
        try
        {
            //do something that fails
        }
        catch (Exception e)
        {
            LogException(e);
            return InternalServerError();
        }
    }
}

public class MyControllerBase : ControllerBase
{
    public InternalServerErrorObjectResult InternalServerError()
    {
        return new InternalServerErrorObjectResult();
    }

    public InternalServerErrorObjectResult InternalServerError(object value)
    {
        return new InternalServerErrorObjectResult(value);
    }
}

public class InternalServerErrorObjectResult : ObjectResult
{
    public InternalServerErrorObjectResult(object value) : base(value)
    {
        StatusCode = StatusCodes.Status500InternalServerError;
    }

    public InternalServerErrorObjectResult() : this(null)
    {
        StatusCode = StatusCodes.Status500InternalServerError;
    }
}

6

আপনি যখন এমভিসিতে একটি JSON প্রতিক্রিয়া ফিরিয়ে দিতে চান। নেট কোর আপনি এটি ব্যবহার করতে পারেন:

Response.StatusCode = (int)HttpStatusCode.InternalServerError;//Equals to HTTPResponse 500
return Json(new { responseText = "my error" });

এটি JSON ফলাফল এবং HTTPStatus উভয়ই ফিরিয়ে দেবে। আমি jQuery.ajax () এ ফলাফল ফেরত দেওয়ার জন্য এটি ব্যবহার করি।


1
আমাকে ব্যবহার করতে হয়েছিল return new JsonResult ...তবে অন্যথায় দুর্দান্ত কাজ করেছে।
মাইক টাভের্ন

5

অ্যাসপেটকোর -৩.১ এর জন্য, আপনি এটিও ব্যবহার করতে পারেন Problem() নীচের মত ;

https://docs.microsoft.com/en-us/aspnet/core/web-api/handle-errors?view=aspnetcore-3.1

 [Route("/error-local-development")]
public IActionResult ErrorLocalDevelopment(
    [FromServices] IWebHostEnvironment webHostEnvironment)
{
    if (webHostEnvironment.EnvironmentName != "Development")
    {
        throw new InvalidOperationException(
            "This shouldn't be invoked in non-development environments.");
    }

    var context = HttpContext.Features.Get<IExceptionHandlerFeature>();

    return Problem(
        detail: context.Error.StackTrace,
        title: context.Error.Message);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.