ASP.NET वेब एपीआई में त्रुटियों को वापस करने के लिए सबसे अच्छा अभ्यास


384

मुझे इस बात की चिंता है कि हम क्लाइंट को क्या गलतियाँ देते हैं।

क्या हम त्रुटि मिलने पर HttpResponseException को फेंककर तुरंत त्रुटि लौटाते हैं :

public void Post(Customer customer)
{
    if (string.IsNullOrEmpty(customer.Name))
    {
        throw new HttpResponseException("Customer Name cannot be empty", HttpStatusCode.BadRequest) 
    }
    if (customer.Accounts.Count == 0)
    {
         throw new HttpResponseException("Customer does not have any account", HttpStatusCode.BadRequest) 
    }
}

या हम सभी त्रुटियों को जमा करते हैं फिर ग्राहक को वापस भेजते हैं:

public void Post(Customer customer)
{
    List<string> errors = new List<string>();
    if (string.IsNullOrEmpty(customer.Name))
    {
        errors.Add("Customer Name cannot be empty"); 
    }
    if (customer.Accounts.Count == 0)
    {
         errors.Add("Customer does not have any account"); 
    }
    var responseMessage = new HttpResponseMessage<List<string>>(errors, HttpStatusCode.BadRequest);
    throw new HttpResponseException(responseMessage);
}

यह सिर्फ एक नमूना कोड है, यह या तो सत्यापन त्रुटियों या सर्वर त्रुटि से कोई फर्क नहीं पड़ता, मैं सिर्फ सबसे अच्छा अभ्यास, प्रत्येक दृष्टिकोण के पेशेवरों और विपक्षों को जानना चाहूंगा।


1
देखें stackoverflow.com/a/22163675/200442 आप का उपयोग किया जाना चाहिए ModelState
डैनियल लिटिल

1
ध्यान दें कि यहां उत्तर केवल अपवादों को कवर करते हैं जो नियंत्रक में ही फेंक दिए जाते हैं। यदि आपका API एक IQueryable <मॉडल> ​​लौटाता है जिसे अभी तक निष्पादित नहीं किया गया है, तो अपवाद नियंत्रक में नहीं है और पकड़ा नहीं गया है ...
Jess

3
बहुत अच्छा सवाल है, लेकिन किसी भी तरह मैं HttpResponseExceptionकक्षा के किसी भी निर्माता को अधिभार नहीं दे रहा हूं, जो आपके पोस्ट में उल्लिखित दो मापदंडों को लेता है - HttpResponseException("Customer Name cannot be empty", HttpStatusCode.BadRequest) यानीHttpResponseException(string, HttpStatusCode)
RBT

जवाबों:


293

मेरे लिए मैं आमतौर पर एक वापस भेज देता हूं HttpResponseExceptionऔर फेंक दिए गए अपवाद के आधार पर स्थिति कोड निर्धारित करता हूं और यदि अपवाद घातक है या नहीं, यह निर्धारित करेगा कि मैं HttpResponseExceptionतुरंत वापस भेजता हूं या नहीं ।

दिन के अंत में यह एक एपीआई है जो प्रतिक्रियाएं भेज रहा है और विचार नहीं है, इसलिए मुझे लगता है कि उपभोक्ता को अपवाद और स्थिति कोड के साथ एक संदेश वापस भेजना ठीक है। मुझे वर्तमान में त्रुटियों को जमा करने और उन्हें वापस भेजने की आवश्यकता नहीं है क्योंकि ज्यादातर अपवाद आमतौर पर गलत मापदंडों या कॉल आदि के कारण होते हैं।

मेरे ऐप में एक उदाहरण यह है कि कभी-कभी क्लाइंट डेटा मांगेगा, लेकिन कोई डेटा उपलब्ध नहीं है, इसलिए मैंने एक कस्टम को फेंक दिया NoDataAvailableExceptionऔर इसे वेब एपीआई ऐप पर बुलबुले कर दिया, फिर मेरे कस्टम फ़िल्टर में जो इसे वापस भेजने पर कब्जा कर रहा है सही स्थिति कोड के साथ प्रासंगिक संदेश।

मुझे इस पर 100% यकीन नहीं है कि इसके लिए सबसे अच्छा अभ्यास क्या है, लेकिन यह मेरे लिए वर्तमान में काम कर रहा है इसलिए मैं कर रहा हूं।

अपडेट :

चूँकि मैंने इस प्रश्न का उत्तर दिया है इसलिए इस विषय पर कुछ ब्लॉग पोस्ट लिखे गए हैं:

https://weblogs.asp.net/fredriknormen/asp-net-web-api-exception-handling

(यह रात के निर्माण में कुछ नई विशेषताएं हैं) https://docs.microsoft.com/archive/blogs/youssefm/error-handling-in-asp-net-webapi

अपडेट २

हमारी त्रुटि हैंडलिंग प्रक्रिया में अपडेट करें, हमारे पास दो मामले हैं:

  1. सामान्य त्रुटियों जैसे कि नहीं मिला है, या किसी कार्रवाई के लिए अमान्य पैरामीटर हम HttpResponseExceptionप्रसंस्करण को रोकने के लिए तुरंत वापस लौटते हैं । इसके अतिरिक्त हमारे कार्यों में मॉडल त्रुटियों के लिए हम मॉडल स्टेट डिक्शनरी को Request.CreateErrorResponseएक्सटेंशन में सौंप देंगे और इसे एक में लपेटेंगे HttpResponseException। प्रतिरूप निकाय में भेजे गए मॉडल त्रुटियों की एक सूची में मॉडल स्थिति शब्दकोश परिणाम जोड़ना।

  2. उच्चतर परतों में होने वाली त्रुटियों के लिए, सर्वर त्रुटियां, हम वेब API एप्लिकेशन को अपवाद बबल देते हैं, यहां हमारे पास एक वैश्विक अपवाद फ़िल्टर है जो अपवाद को देखता है, इसे ELMAH के साथ लॉग करता है और सही HTTP सेट करने के लिए इसे समझने की कोशिश करता है स्थिति कोड और शरीर के रूप में एक प्रासंगिक मैत्रीपूर्ण त्रुटि संदेश फिर से HttpResponseException। अपवाद के लिए कि हम ग्राहक से उम्मीद नहीं कर रहे हैं कि डिफ़ॉल्ट 500 आंतरिक सर्वर त्रुटि प्राप्त होगी, लेकिन सुरक्षा कारणों से एक सामान्य संदेश।

अपडेट ३

हाल ही में, वेब API 2 को चुनने के बाद, सामान्य त्रुटियों को वापस भेजने के लिए, अब हम IHttpActionResult इंटरफ़ेस का उपयोग करते हैं , विशेष System.Web.Http.Resultsरूप से Notpound, BadRequest जैसे नामस्थानों के लिए कक्षाओं में जब वे फिट होते हैं, यदि वे उन्हें विस्तारित नहीं करते हैं, उदाहरण के लिए एक प्रतिक्रिया संदेश के साथ एक नोट परिणाम:

public class NotFoundWithMessageResult : IHttpActionResult
{
    private string message;

    public NotFoundWithMessageResult(string message)
    {
        this.message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(HttpStatusCode.NotFound);
        response.Content = new StringContent(message);
        return Task.FromResult(response);
    }
}

आपके उत्तर के लिए धन्यवाद geepie, यह एक अच्छा अनुभव है, इसलिए आप तुरंत एक्सपैक्शन भेजना पसंद करते हैं?
congongle

जैसा कि मैंने कहा कि यह वास्तव में अपवाद पर निर्भर करता है। उदाहरण के लिए एक घातक अपवाद जैसे उपयोगकर्ता वेब एपि को एक समापन बिंदु के लिए एक अवैध पैरामीटर से गुजरता है, फिर मैं एक HttpResponseException बनाऊंगा और इसे सीधे उपभोग एप्लिकेशन को वापस कर दूंगा।
जीडीपी

प्रश्न में अपवाद वास्तव में सत्यापन के बारे में अधिक हैं stackoverflow.com/a/22163675/200442 देखें ।
डैनियल लिटिल

1
@DanielLittle ने अपने सवाल को फिर से पढ़ा। मैं बोली: "यह सिर्फ एक नमूना कोड है, यह या तो सत्यापन त्रुटियों या सर्वर त्रुटि से कोई फर्क नहीं पड़ता"
gdp

@gdp यहां तक ​​कि वास्तव में इसके दो घटक हैं, सत्यापन और अपवाद, इसलिए दोनों को कवर करना सबसे अच्छा है।
डैनियल लिटिल

184

ASP.NET वेब API 2 ने वास्तव में इसे सरल बनाया है। उदाहरण के लिए, निम्न कोड:

public HttpResponseMessage GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        var message = string.Format("Product with id = {0} not found", id);
        HttpError err = new HttpError(message);
        return Request.CreateResponse(HttpStatusCode.NotFound, err);
    }
    else
    {
        return Request.CreateResponse(HttpStatusCode.OK, item);
    }
}

आइटम नहीं मिलने पर ब्राउज़र को निम्न सामग्री लौटाता है:

HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Date: Thu, 09 Aug 2012 23:27:18 GMT
Content-Length: 51

{
  "Message": "Product with id = 12 not found"
}

सुझाव: जब तक कोई भयावह त्रुटि न हो (उदाहरण के लिए, WCF दोष अपवाद) HTTP त्रुटि 500 ​​को न फेंके। एक उपयुक्त HTTP स्थिति कोड चुनें जो आपके डेटा की स्थिति का प्रतिनिधित्व करता है। (नीचे दिए गए एपीजी लिंक को देखें।)

लिंक:


4
मैं एक कदम आगे जाऊंगा और DAL / रेपो से एक रिसोर्सनोटफाउंड एक्ससेप्शन को फेंक दूंगा, जिसे मैं Web Api 2.2 ExceptionHandler में टाइप रिसोर्सनॉटफाउंड एक्ससेप्शन के लिए चेक करता हूं और फिर मैं "उत्पाद के साथ आईडी एक्सएक्सएक्स पाया" वापस करता हूं। इस तरह से प्रत्येक कार्रवाई के बजाय वास्तुकला में इसकी उदारता से लंगर डाला गया।
पास्कल

1
वहाँ के लिए कोई विशिष्ट उपयोग है return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); क्या बीच का अंतर है CreateResponseऔरCreateErrorResponse
Zapnologica

10
W3.org/Protocols/rfc2616/rfc2616-sec10.html के अनुसार, क्लाइंट त्रुटि 400 स्तर का कोड है और सर्वर त्रुटि 500 ​​स्तर का कोड है। तो एक वेब एपीआई के लिए कई मामलों में 500 त्रुटि कोड बहुत उपयुक्त हो सकता है, न कि केवल "भयावह" त्रुटियां।
जेस

2
आपको दिखाने के using System.Net.Http;लिए CreateResponse()विस्तार विधि की आवश्यकता है ।
एडम श्याबो

मुझे Request.CreateResponse () का उपयोग करने के बारे में जो पसंद नहीं है, वह यह है कि यह अनावश्यक Microsoft-विशिष्ट क्रमांकन जानकारी जैसे "<string xmlns =" schemas.microsoft.com/2003/10/Serialization /" > यहाँ त्रुटि / स्ट्रिंग देता है। > "। उन स्थितियों के लिए जब 400 स्थिति उपयुक्त है, मैंने पाया कि ApiController.BadRequest (स्ट्रिंग संदेश) एक बेहतर "<त्रुटि> <संदेश> मेरी त्रुटि यहां </ संदेश> </ त्रुटि>" स्ट्रिंग देता है। लेकिन मैं एक साधारण संदेश के साथ 500 का दर्जा वापस करने के लिए इसके समकक्ष नहीं मिल सकता।
vkelman

76

ऐसा लगता है कि आप त्रुटियों / अपवादों की तुलना में मान्यता के साथ अधिक परेशानी हो रहे हैं, इसलिए मैं दोनों के बारे में थोड़ा सा कहूंगा।

मान्यकरण

नियंत्रक कार्यों को आम तौर पर इनपुट मॉडल लेना चाहिए जहां सत्यापन सीधे मॉडल पर घोषित किया जाता है।

public class Customer
{ 
    [Require]
    public string Name { get; set; }
}

तब आप एक का उपयोग कर सकते हैं ActionFilterजो स्वचालित रूप से सत्यापन संदेश क्लाइंट को भेजता है।

public class ValidationActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var modelState = actionContext.ModelState;

        if (!modelState.IsValid) {
            actionContext.Response = actionContext.Request
                 .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }
    }
} 

इस बारे में अधिक जानकारी के लिए http://ben.onfabrik.com/posts/automatic-modelstate-validation-in-aspnet-mvc

गलती संभालना

ग्राहक को एक संदेश वापस करना सबसे अच्छा है जो उस अपवाद का प्रतिनिधित्व करता है जो हुआ (प्रासंगिक स्थिति कोड के साथ)।

Request.CreateErrorResponse(HttpStatusCode, message)यदि आप कोई संदेश निर्दिष्ट करना चाहते हैं, तो बॉक्स में से आपको उपयोग करना होगा। हालाँकि, यह कोड को Requestऑब्जेक्ट से जोड़ता है, जिसे आपको करने की आवश्यकता नहीं है।

मैं आमतौर पर अपने स्वयं के "सुरक्षित" अपवाद बनाता हूं, जो मुझे उम्मीद है कि ग्राहक को पता होगा कि सभी को सामान्य 500 त्रुटि के साथ कैसे संभालना और लपेटना है।

अपवादों को संभालने के लिए एक्शन फिल्टर का उपयोग इस तरह होगा:

public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        var exception = context.Exception as ApiException;
        if (exception != null) {
            context.Response = context.Request.CreateErrorResponse(exception.StatusCode, exception.Message);
        }
    }
}

फिर आप इसे विश्व स्तर पर पंजीकृत कर सकते हैं।

GlobalConfiguration.Configuration.Filters.Add(new ApiExceptionFilterAttribute());

यह मेरा कस्टम अपवाद प्रकार है।

using System;
using System.Net;

namespace WebApi
{
    public class ApiException : Exception
    {
        private readonly HttpStatusCode statusCode;

        public ApiException (HttpStatusCode statusCode, string message, Exception ex)
            : base(message, ex)
        {
            this.statusCode = statusCode;
        }

        public ApiException (HttpStatusCode statusCode, string message)
            : base(message)
        {
            this.statusCode = statusCode;
        }

        public ApiException (HttpStatusCode statusCode)
        {
            this.statusCode = statusCode;
        }

        public HttpStatusCode StatusCode
        {
            get { return this.statusCode; }
        }
    }
}

एक उदाहरण अपवाद है कि मेरा एपीआई फेंक सकता है।

public class NotAuthenticatedException : ApiException
{
    public NotAuthenticatedException()
        : base(HttpStatusCode.Forbidden)
    {
    }
}

मेरे पास ApiExceptionFilterAttribute वर्ग परिभाषा में त्रुटि से निपटने के उत्तर के साथ एक समस्या है। OnException विधि में, अपवाद .tatusCode अपवाद नहीं है क्योंकि अपवाद एक WebException है। मैं इस मामले में क्या कर सकता हूं?
razp26

1
@ razp26 यदि आप var exception = context.Exception as WebException;उस प्रकार का उल्लेख कर रहे हैं जो कि एक टाइपो था, तो यह होना चाहिए थाApiException
डैनियल लिटिल

2
क्या आप कृपया एक उदाहरण जोड़ सकते हैं कि ApiExceptionFilterAttribute वर्ग का उपयोग कैसे किया जाएगा?
razp26

36

आप एक HttpResponseException को फेंक सकते हैं

HttpResponseMessage response = 
    this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "your message");
throw new HttpResponseException(response);

23

वेब एपीआई 2 के लिए मेरे तरीके लगातार IHttpActionResult लौटाते हैं इसलिए मैं उपयोग करता हूं ...

public IHttpActionResult Save(MyEntity entity)
{
  ....

    return ResponseMessage(
        Request.CreateResponse(
            HttpStatusCode.BadRequest, 
            validationErrors));
}

यह उत्तर ठीक है, जबकि आपको संदर्भ जोड़ना चाहिएSystem.Net.Http
बेलश

19

यदि आप ASP.NET वेब API 2 का उपयोग कर रहे हैं, तो ApiController Short-Method का उपयोग करना सबसे आसान तरीका है। यह एक BadRequestResult में परिणाम होगा।

return BadRequest("message");

मॉडल सत्यापन त्रुटियों के लिए सख्ती से मैं BadRequest () के अधिभार का उपयोग करता हूं जो मॉडलस्टेट ऑब्जेक्ट को स्वीकार करता है:return BadRequest(ModelState);
timmi4sa

4

आप मॉडल को मान्य करने के लिए Web Api में कस्टम ActionFilter का उपयोग कर सकते हैं

public class DRFValidationFilters : ActionFilterAttribute
{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request
                 .CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);

            //BadRequest(actionContext.ModelState);
        }
    }
    public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {

        return Task.Factory.StartNew(() => {

            if (!actionContext.ModelState.IsValid)
            {
                actionContext.Response = actionContext.Request
                     .CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);                    
            }
        });

    }

public class AspirantModel
{
    public int AspirantId { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }        
    public string LastName { get; set; }
    public string AspirantType { get; set; }       
    [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Not a valid Phone number")]
    public string MobileNumber { get; set; }
    public int StateId { get; set; }
    public int CityId { get; set; }
    public int CenterId { get; set; }

}

    [HttpPost]
    [Route("AspirantCreate")]
    [DRFValidationFilters]
    public IHttpActionResult Create(AspirantModel aspirant)
    {
            if (aspirant != null)
            {

            }
            else
            {
                return Conflict();
            }
          return Ok();

}

WebApiConfig.cs config में पंजीकृत कस्टमअट्रीब्यूट करें। फ़ाइटर।अड (नया DRFValidationFilters ());


4

इमारत का Manish Jainजवाब (जो वेब एपीआई 2 के लिए है जो चीजों को सरल बनाता है):

1) संभव के रूप में कई सत्यापन त्रुटियों के जवाब के लिए सत्यापन संरचनाओं का उपयोग करें । इन संरचनाओं का उपयोग रूपों से आने वाले अनुरोधों की प्रतिक्रिया के लिए भी किया जा सकता है।

public class FieldError
{
    public String FieldName { get; set; }
    public String FieldMessage { get; set; }
}

// a result will be able to inform API client about some general error/information and details information (related to invalid parameter values etc.)
public class ValidationResult<T>
{
    public bool IsError { get; set; }

    /// <summary>
    /// validation message. It is used as a success message if IsError is false, otherwise it is an error message
    /// </summary>
    public string Message { get; set; } = string.Empty;

    public List<FieldError> FieldErrors { get; set; } = new List<FieldError>();

    public T Payload { get; set; }

    public void AddFieldError(string fieldName, string fieldMessage)
    {
        if (string.IsNullOrWhiteSpace(fieldName))
            throw new ArgumentException("Empty field name");

        if (string.IsNullOrWhiteSpace(fieldMessage))
            throw new ArgumentException("Empty field message");

        // appending error to existing one, if field already contains a message
        var existingFieldError = FieldErrors.FirstOrDefault(e => e.FieldName.Equals(fieldName));
        if (existingFieldError == null)
            FieldErrors.Add(new FieldError {FieldName = fieldName, FieldMessage = fieldMessage});
        else
            existingFieldError.FieldMessage = $"{existingFieldError.FieldMessage}. {fieldMessage}";

        IsError = true;
    }

    public void AddEmptyFieldError(string fieldName, string contextInfo = null)
    {
        AddFieldError(fieldName, $"No value provided for field. Context info: {contextInfo}");
    }
}

public class ValidationResult : ValidationResult<object>
{

}

2) सेवा की परतValidationResult सफल होगी , चाहे ऑपरेशन सफल हो या न हो। उदाहरण के लिए:

    public ValidationResult DoSomeAction(RequestFilters filters)
    {
        var ret = new ValidationResult();

        if (filters.SomeProp1 == null) ret.AddEmptyFieldError(nameof(filters.SomeProp1));
        if (filters.SomeOtherProp2 == null) ret.AddFieldError(nameof(filters.SomeOtherProp2 ), $"Failed to parse {filters.SomeOtherProp2} into integer list");

        if (filters.MinProp == null) ret.AddEmptyFieldError(nameof(filters.MinProp));
        if (filters.MaxProp == null) ret.AddEmptyFieldError(nameof(filters.MaxProp));


        // validation affecting multiple input parameters
        if (filters.MinProp > filters.MaxProp)
        {
            ret.AddFieldError(nameof(filters.MinProp, "Min prop cannot be greater than max prop"));
            ret.AddFieldError(nameof(filters.MaxProp, "Check"));
        }

        // also specify a global error message, if we have at least one error
        if (ret.IsError)
        {
            ret.Message = "Failed to perform DoSomeAction";
            return ret;
        }

        ret.Message = "Successfully performed DoSomeAction";
        return ret;
    }

3) एपीआई नियंत्रक सेवा फ़ंक्शन परिणाम के आधार पर प्रतिक्रिया का निर्माण करेगा

एक विकल्प लगभग सभी मापदंडों को वैकल्पिक के रूप में रखना और कस्टम सत्यापन करना है जो अधिक सार्थक प्रतिक्रिया देता है। इसके अलावा, मैं इस बात का ध्यान रख रहा हूं कि किसी भी अपवाद को सेवा सीमा से आगे नहीं जाने दिया जाए।

    [Route("DoSomeAction")]
    [HttpPost]
    public HttpResponseMessage DoSomeAction(int? someProp1 = null, string someOtherProp2 = null, int? minProp = null, int? maxProp = null)
    {
        try
        {
            var filters = new RequestFilters 
            {
                SomeProp1 = someProp1 ,
                SomeOtherProp2 = someOtherProp2.TrySplitIntegerList() ,
                MinProp = minProp, 
                MaxProp = maxProp
            };

            var result = theService.DoSomeAction(filters);
            return !result.IsError ? Request.CreateResponse(HttpStatusCode.OK, result) : Request.CreateResponse(HttpStatusCode.BadRequest, result);
        }
        catch (Exception exc)
        {
            Logger.Log(LogLevel.Error, exc, "Failed to DoSomeAction");
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError("Failed to DoSomeAction - internal error"));
        }
    }

3

अंतर्निहित "इन्टरनल सेवरर्रर" विधि (एपीकंट्रोलर में उपलब्ध) का उपयोग करें:

return InternalServerError();
//or...
return InternalServerError(new YourException("your message"));

0

बस ASP.NET WebAPI की वर्तमान स्थिति पर अद्यतन करने के लिए। इंटरफ़ेस अब कहा जाता है IActionResultऔर कार्यान्वयन में बहुत बदलाव नहीं हुआ है:

[JsonObject(IsReference = true)]
public class DuplicateEntityException : IActionResult
{        
    public DuplicateEntityException(object duplicateEntity, object entityId)
    {
        this.EntityType = duplicateEntity.GetType().Name;
        this.EntityId = entityId;
    }

    /// <summary>
    ///     Id of the duplicate (new) entity
    /// </summary>
    public object EntityId { get; set; }

    /// <summary>
    ///     Type of the duplicate (new) entity
    /// </summary>
    public string EntityType { get; set; }

    public Task ExecuteResultAsync(ActionContext context)
    {
        var message = new StringContent($"{this.EntityType ?? "Entity"} with id {this.EntityId ?? "(no id)"} already exist in the database");

        var response = new HttpResponseMessage(HttpStatusCode.Ambiguous) { Content = message };

        return Task.FromResult(response);
    }

    #endregion
}

यह दिलचस्प लग रहा है, लेकिन इस परियोजना में विशेष रूप से इस कोड को कहां रखा गया है? मैं vb.net में अपनी वेब एपीआई 2 परियोजना कर रहा हूं।
ऑफ गोल्ड द गोल्ड

यह त्रुटि वापस करने के लिए सिर्फ एक मॉडल है और कहीं भी निवास कर सकता है। आप अपने नियंत्रक में उपरोक्त वर्ग का एक नया उदाहरण देंगे। लेकिन ईमानदार होने के लिए मैं जब भी संभव हो, कक्षाओं में निर्मित का उपयोग करने की कोशिश करता हूं: यह। (), क्रिएटेडटाउट (), नोटफाउंड ()। विधि का हस्ताक्षर IHttpActionResult होगा। पता नहीं अगर वे नेटकोर के साथ यह सब बदल गए
थॉमस

-2

उन त्रुटियों के लिए जहां modelstate.isvalid गलत है, मैं आमतौर पर त्रुटि भेजता हूं क्योंकि यह कोड द्वारा फेंका गया है। डेवलपर के लिए समझना आसान है जो मेरी सेवा का उपभोग कर रहा है। मैं आमतौर पर नीचे दिए गए कोड का उपयोग करके परिणाम भेजता हूं।

     if(!ModelState.IsValid) {
                List<string> errorlist=new List<string>();
                foreach (var value in ModelState.Values)
                {
                    foreach(var error in value.Errors)
                    errorlist.Add( error.Exception.ToString());
                    //errorlist.Add(value.Errors);
                }
                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest,errorlist);}

यह क्लाइंट को नीचे प्रारूप में त्रुटि भेजता है जो मूल रूप से त्रुटियों की एक सूची है:

    [  
    "Newtonsoft.Json.JsonReaderException: **Could not convert string to integer: abc. Path 'Country',** line 6, position 16.\r\n   
at Newtonsoft.Json.JsonReader.ReadAsInt32Internal()\r\n   
at Newtonsoft.Json.JsonTextReader.ReadAsInt32()\r\n   
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter, Boolean inArray)\r\n   
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)",

       "Newtonsoft.Json.JsonReaderException: **Could not convert string to integer: ab. Path 'State'**, line 7, position 13.\r\n   
at Newtonsoft.Json.JsonReader.ReadAsInt32Internal()\r\n   
at Newtonsoft.Json.JsonTextReader.ReadAsInt32()\r\n   
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter, Boolean inArray)\r\n   
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)"
    ]

मैं अपवाद के इस स्तर को वापस भेजने की अनुशंसा नहीं करूंगा यदि यह एक बाहरी एपीआई (यानी सार्वजनिक इंटरनेट के संपर्क में) था। आपको फ़िल्टर में कुछ और काम करना चाहिए और एक JSON ऑब्जेक्ट (या XML का चयन करें यदि वह चुना हुआ प्रारूप है) केवल अपवाद के एक ToString के बजाय त्रुटि का विवरण दें।
सुधांशु मिश्रा

सही एपीआई ने बाहरी एपीआई के लिए इस अपवाद को नहीं भेजा। लेकिन आप इसका उपयोग आंतरिक एपीआई और परीक्षण के दौरान मुद्दों को डीबग करने के लिए कर सकते हैं।
आशीष साहू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.