नियंत्रक से विशिष्ट स्थिति कोड और कोई सामग्री कैसे लौटाएं?


119

मैं नीचे कोई सामग्री के साथ एक स्थिति कोड 418 वापस करने के लिए उदाहरण नियंत्रक चाहते हैं। स्टेटस कोड को सेट करना काफी आसान है लेकिन फिर ऐसा लगता है कि कुछ ऐसा है जिसे अनुरोध के अंत का संकेत देने के लिए कुछ करना होगा। ASP.NET Core से पहले या WebForms में MVC में, जो कि एक कॉल हो सकता है, Response.End()लेकिन यह ASP.NET कोर में कैसे काम Response.Endकरता है, जहां मौजूद नहीं है?

public class ExampleController : Controller
{
    [HttpGet][Route("/example/main")]
    public IActionResult Main()
    {
        this.HttpContext.Response.StatusCode = 418; // I'm a teapot
        // How to end the request?
        // I don't actually want to return a view but perhaps the next
        // line is required anyway?
        return View();   
    }
}

जवाबों:


246

this.HttpContext.Response.StatusCode = 418; // I'm a teapot

अनुरोध को कैसे समाप्त करें?

अन्य समाधान का प्रयास करें, बस:

return StatusCode(418);


आप StatusCode(???)किसी भी HTTP स्थिति कोड को वापस करने के लिए उपयोग कर सकते हैं ।


इसके अलावा, आप समर्पित परिणामों का उपयोग कर सकते हैं:

सफलता:

  • return Ok() ← एचटीपी स्टेटस कोड 200
  • return Created() ← Http स्टेटस कोड 201
  • return NoContent(); ← Http स्टेटस कोड 204

ग्राहक त्रुटि:

  • return BadRequest(); ← Http स्थिति कोड 400
  • return Unauthorized(); ← Http स्थिति कोड 401
  • return NotFound(); ← Http स्टेटस कोड 404


अधिक जानकारी:


62
there is no dedicated result for 418 गंभीर लापता कार्यक्षमता यहाँ, Microsoft।
जेस

1
मैंने अपना उत्तर अपडेट कर दिया है क्योंकि मैंने पाया NoContent();कि http त्रुटि कोड 204 है।
लुकाज़ Makowej

1
यहां कंट्रोलरबेस क्लास का लिंक दिया गया है, जो कि इन सभी आउट-ऑफ-द-बॉक्स परिणाम प्रकारों को परिभाषित करता है। docs.microsoft.com/en-us/aspnet/core/api/…
Technetium

3
फिर भी, आप बस नामस्थान ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ) StatusCodesसे उपयोग कर सकते हैं । Microsoft.AspNetCore.Http
लुकाज़ Makowej

1
हाँ, यह काम करेगा, या आप उपयोग कर सकते हैंStatusCode(StatusCodes.Status412PreconditionFailed);
लुकाज़ मकोवेज़

4

यह कोड गैर- .NET कोर MVC नियंत्रकों के लिए काम कर सकता है:

this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);

4

यदि कोई ऐसा करना चाहता है तो IHttpActionResultवह वेब API प्रोजेक्ट में हो सकता है, नीचे उपयोगी हो सकता है।

// GET: api/Default/
public IHttpActionResult Get()
{
    //return Ok();//200
    //return StatusCode(HttpStatusCode.Accepted);//202
    //return BadRequest();//400
    //return InternalServerError();//500
    //return Unauthorized();//401
    return Ok();
}

1

देखें कि वर्तमान वस्तु परिणाम कैसे बनाए जाते हैं। यहाँ BadRequestObjectResult है। मान और StatusCode के साथ ObjectResult का सिर्फ एक एक्सटेंशन।

https://github.com/aspnet/Mvc/blob/master/src/Microsoft.AspNetCore.Mvc.Core/BadRequestObjectResult.cs

मैं एक TimeoutExceptionObjectResult 408 के लिए उसी तरह बनाया है।

/// <summary>
/// An <see cref="ObjectResult"/> that when executed will produce a Request Timeout (408) response.
/// </summary>
[DefaultStatusCode(DefaultStatusCode)]
public class TimeoutExceptionObjectResult : ObjectResult
{
    private const int DefaultStatusCode = StatusCodes.Status408RequestTimeout;

    /// <summary>
    /// Creates a new <see cref="TimeoutExceptionObjectResult"/> instance.
    /// </summary>
    /// <param name="error">Contains the errors to be returned to the client.</param>
    public TimeoutExceptionObjectResult(object error)
        : base(error)
    {
        StatusCode = DefaultStatusCode;
    }
}

ग्राहक:

if (ex is TimeoutException)
{
    return new TimeoutExceptionObjectResult("The request timed out.");
}

1

सबसे अच्छा तरीका यह है:

return this.StatusCode(StatusCodes.Status418ImATeapot, "Error message");

'StatusCodes' में हर तरह की रिटर्न स्थिति है और आप सभी को इस लिंक https://httpstatuses.com/ पर देख सकते हैं

एक बार जब आप अपना StatusCode चुनते हैं, तो उसे एक संदेश के साथ लौटा दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.