এএসপি.নেট ওয়েব এপিআই-তে ত্রুটিগুলি ফিরিয়ে আনতে সেরা অনুশীলন


384

যেভাবে আমরা ক্লায়েন্টকে ত্রুটি ফিরিয়ে দিচ্ছি তাতে আমার উদ্বেগ রয়েছে।

আমরা কোনও ত্রুটি পেলে আমরা কি এইচটিটিপি রেসপনস এক্সেকশনটি ততক্ষণে ফিরে আসি :

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
আপনার ব্যবহার করা উচিত স্ট্যাকওভারফ্লো.com/a/22163675/200442 দেখুন ModelState
ড্যানিয়েল লিটল

1
নোট করুন যে এখানে উত্তরগুলি কেবলমাত্র ব্যতিক্রমগুলি কভার করে যা নিজেই নিয়ামকের মধ্যে ফেলে দেওয়া হয়। যদি আপনার এপিআই কোনও আইকুয়্যারেবল <মডেল> ফেরত দেয় যা এখনও কার্যকর করা হয়নি তবে ব্যতিক্রমটি নিয়ামকের মধ্যে নেই এবং ধরা পড়ে না ...
জেস

3
খুব সুন্দর প্রশ্ন তবে কোনওভাবেই আমি HttpResponseExceptionক্লাসের কোনও কন্সট্রাক্টর ওভারলোড পাচ্ছি না যা আপনার পোস্টে উল্লিখিত দুটি প্যারামিটার লাগে - HttpResponseException("Customer Name cannot be empty", HttpStatusCode.BadRequest) যেমনHttpResponseException(string, HttpStatusCode)
আরবিটি

উত্তর:


293

আমার জন্য আমি সাধারণত একটি প্রেরণ করি HttpResponseExceptionএবং ততক্ষণে ফেলে দেওয়া ব্যতিক্রমগুলির উপর নির্ভর করে স্থিতি কোডটি সেট করি এবং যদি ব্যতিক্রম মারাত্মক হয় বা না তা নির্ধারণ করে দেয় যে আমি HttpResponseExceptionতাত্ক্ষণিকভাবে ফেরত পাঠাচ্ছি কিনা ।

দিনের শেষে এটি একটি এপিআই যা প্রতিক্রিয়াগুলি ফেরত পাঠায় এবং ভিউগুলি নয়, তাই আমি মনে করি গ্রাহককে ব্যতিক্রম এবং স্থিতি কোড সহ কোনও বার্তা ফেরত পাঠানো ভাল। আমার বর্তমানে ত্রুটিগুলি জমা করতে এবং সেগুলি ফেরত পাঠানোর প্রয়োজন হয়নি কারণ বেশিরভাগ ব্যতিক্রম সাধারণত ভুল পরামিতি বা কল ইত্যাদির কারণে হয় etc.

আমার অ্যাপ্লিকেশনটির একটি উদাহরণ হ'ল কখনও কখনও ক্লায়েন্ট ডেটা জিজ্ঞাসা করে, তবে কোনও ডেটা উপলব্ধ নেই তাই আমি একটি কাস্টম নিক্ষেপ করব NoDataAvailableExceptionএবং এটি ওয়েব এপিআই অ্যাপ্লিকেশনটিতে বুদবুদ করতে দেব, যেখানে আমার কাস্টম ফিল্টারটিতে এটি আবার প্রেরণে ক্যাপচার করে where সঠিক স্থিতি কোড সহ প্রাসঙ্গিক বার্তা।

আমি এর জন্য সর্বোত্তম অনুশীলন কী তা সম্পর্কে 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

আপডেট 2

আমাদের ত্রুটি পরিচালনার প্রক্রিয়া আপডেট করুন, আমাদের দুটি মামলা রয়েছে:

  1. সাধারণ ত্রুটিগুলির জন্য যেমন পাওয়া যায় নি, বা অবৈধ পরামিতিগুলি ক্রিয়াতে প্রেরণ করা হচ্ছে আমরা HttpResponseExceptionতত্ক্ষণাত প্রক্রিয়া বন্ধ করার জন্য ফিরে আসি। অতিরিক্তভাবে আমাদের ক্রিয়ায় মডেল ত্রুটির জন্য আমরা মডেল রাষ্ট্রের Request.CreateErrorResponseঅভিধানটি প্রসারণের কাছে হস্তান্তর করব এবং এটিকে মোড়কে দেব HttpResponseException। মডেল রাজ্যের অভিধান যুক্ত করার ফলে প্রতিক্রিয়া সংস্থায় প্রেরণ করা মডেল ত্রুটির একটি তালিকার ফলাফল।

  2. উচ্চতর স্তরগুলিতে ঘটে যাওয়া ত্রুটিগুলির জন্য, সার্ভার ত্রুটিগুলি, আমরা ব্যতিক্রমটি ওয়েব এপিআই অ্যাপ্লিকেশনটিকে বুবলি করি, এখানে আমাদের একটি বৈশ্বিক ব্যতিক্রম ফিল্টার রয়েছে যা ব্যতিক্রমটিকে দেখায়, এটি এলএএমএএএইচ-এর সাথে লগ করে এবং এটি সঠিক এইচটিটিপি সেট করে তোলে তা বোঝার চেষ্টা করে স্থিতি কোড এবং শরীরের হিসাবে আবার প্রাসঙ্গিক বন্ধুত্বপূর্ণ ত্রুটি বার্তা এ HttpResponseException। ব্যতিক্রমগুলি যে আমরা প্রত্যাশা করি না ক্লায়েন্টটি ডিফল্ট 500 অভ্যন্তরীণ সার্ভার ত্রুটিটি পাবে, তবে সুরক্ষার কারণে জেনেরিক বার্তা।

আপডেট 3

সম্প্রতি, ওয়েব এপিআই 2 বাছাইয়ের পরে, সাধারণ ত্রুটিগুলি ফেরত পাঠানোর জন্য আমরা এখন IHttpActionResult ইন্টারফেসটি ব্যবহার করি , বিশেষত System.Web.Http.Resultsনটফাউন্ড, 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);
    }
}

আপনার উত্তর জিপিটির জন্য আপনাকে ধন্যবাদ, এটি একটি ভাল অভিজ্ঞতা, তাই আপনি অবিলম্বে এক্সপশন প্রেরণ করতে পছন্দ করেন?
কিউংলে

আমি যেমন বলেছি এটি ব্যতিক্রমের উপর নির্ভর করে। মারাত্মক ব্যতিক্রম যেমন উদাহরণস্বরূপ ব্যবহারকারী ওয়েব অপিকে একটি অবৈধ প্যারামিটারটি একটি শেষ পয়েন্টে পাস করে, তবে আমি একটি এইচটিপিআরসপোঁসএক্সেপশন তৈরি করব এবং এটিকে সরাসরি গ্রহণকারী অ্যাপ্লিকেশনটিতে ফিরিয়ে দেব return
জিডিপি

প্রশ্নের ব্যতিক্রমগুলি বৈধতা সম্পর্কে সত্যই আরও বেশি দেখুন stackoverflow.com/a/22163675/200442 দেখুন
ড্যানিয়েল লিটল

1
পুনঃটুইট করুন আমি উদ্ধৃতি দিয়েছি: "এটি কেবলমাত্র একটি নমুনা কোড, এটি বৈধতা ত্রুটি বা সার্ভার ত্রুটির কোনও বিষয় নয়"
জিডিপি

@gdp তবুও এর সত্যিকারের দুটি উপাদান রয়েছে যাচাইকরণ এবং ব্যতিক্রমগুলি, তাই উভয়টিই coverেকে রাখা ভাল।
ড্যানিয়েল লিটল

184

এএসপি.নেট ওয়েব এপিআই 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"
}

পরামর্শ: বিপর্যয়জনিত ত্রুটি না হলে HTTP ত্রুটি 500 নিক্ষেপ করবেন না (উদাহরণস্বরূপ, WCF ফল্ট ব্যতিক্রম)। আপনার উপাত্তের স্থিতি উপস্থাপন করে এমন উপযুক্ত HTTP স্থিতি কোডটি বেছে নিন P (নীচে অ্যাপিজি লিঙ্কটি দেখুন See)

লিঙ্ক:


4
আমি আরও একধাপ এগিয়ে গিয়ে ডাল / রেপো থেকে একটি রিসোর্সনটফাউন্ডএক্সসেপশন নিক্ষেপ করব যা আমি ওয়েব অপি ২.২ এক্সপ্রেসহ্যান্ডলার টাইপ রিসোর্সনটফাউন্ডএক্সসেপশন এর জন্য পরীক্ষা করেছিলাম এবং তারপরে আমি "আইডি এক্সএক্সএক্সএক্সএক্সএক্স সাথে পাওয়া পণ্য পাওয়া যায় নি"। এইভাবে প্রতিটি ক্রিয়নের পরিবর্তে এটি আর্কিটেকচারে সাধারণভাবে নোঙ্গর করা হয়।
পাস্কল

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()এক্সটেনশন পদ্ধতি প্রদর্শিত করতে।
অ্যাডাম জাজো

অনুরোধ.ক্রেইটআরসপোনস () ব্যবহার করার ক্ষেত্রে আমি যা পছন্দ করি না তা হ'ল এটি "<স্ট্রিং xmlns =" স্কিমাস.মাইক্রোসফট / ২০০৩ / ১০ / সিরিয়ালাইজেশন / "> আমার ত্রুটি </ স্ট্রিংয়ের মতো অপ্রয়োজনীয় মাইক্রোসফ্ট-নির্দিষ্ট সিরিয়ালের তথ্য প্রদান করে here > "। 400 স্ট্যাটাস যথাযথ হলে আমি দেখতে পেলাম যে অ্যাপিকন্ট্রোলআর.ড্যাবরেউয়েস্ট (স্ট্রিং মেসেজ) আরও ভাল "<ত্রুটি << বার্তা> আমার ত্রুটি এখানে </ Message> </Er>>" স্ট্রিং দেয়। তবে আমি একটি সাধারণ বার্তার সাথে 500 টি স্ট্যাটাস ফেরত দেওয়ার সমতুল্য খুঁজে পাচ্ছি না।
ভেকেলম্যান

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 বর্গ সংজ্ঞাতে আমার ত্রুটি পরিচালনা করার উত্তর সম্পর্কিত একটি সমস্যা আছে। অনেক্সেপশন পদ্ধতিতে, ব্যতিক্রম। স্ট্যাটাসকোডটি বৈধ নয় কারণ ব্যতিক্রম একটি ওয়েবএক্সসেপশন। এই ক্ষেত্রে আমি কী করতে পারি?
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

আপনি যদি এএসপি.নেট ওয়েব এপিআই 2 ব্যবহার করে থাকেন তবে সবচেয়ে সহজ উপায় হ'ল এপি কন্ট্রোলার শর্ট-মেথড ব্যবহার করা। এটি একটি BadRequestResult এর ফলস্বরূপ।

return BadRequest("message");

মডেল বৈধতা ত্রুটির জন্য কঠোরভাবে আমি BadRequest () এর ওভারলোডটি ব্যবহার করি যা মডেলস্টেট অবজেক্ট গ্রহণ করে:return BadRequest(ModelState);
টিমিমি 4

4

আপনি মডেলকে যাচাই করতে ওয়েব অ্যাপিতে কাস্টম অ্যাকশনফিলার ব্যবহার করতে পারেন

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.Filters.Add (নতুন ডিআরএফভালিডেশন ফিল্টার ()) এ কাস্টমঅ্যাট্রিবিউট শ্রেণি নিবন্ধন করুন;


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) API কন্ট্রোলার পরিষেবা কার্য ফলাফলের ভিত্তিতে প্রতিক্রিয়া তৈরি করবে const

একটি বিকল্প হ'ল কার্যত সমস্ত প্যারামিটারগুলি alচ্ছিক হিসাবে স্থাপন করা এবং কাস্টম বৈধকরণ সম্পাদন করা যা আরও অর্থবহ প্রতিক্রিয়া দেয়। এছাড়াও, আমি কোনও ব্যতিক্রম পরিষেবা সীমানার বাইরে যেতে না দেওয়ার জন্য যত্ন নিচ্ছি।

    [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

কেবলমাত্র এএসপি.নেট ওয়েবএপিআইয়ের বর্তমান অবস্থার বিষয়ে আপডেট করতে। ইন্টারফেসটি এখন বলা হয়েছে 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
}

এটি আকর্ষণীয় দেখায়, তবে প্রকল্পে বিশেষত এই কোডটি কোথায় রাখা হয়েছে? আমি আমার ওয়েব এপিআই 2 প্রকল্পটি ভিবিএনটিতে করছি।
দ্য গোল্ডটি

এটি ত্রুটি ফিরিয়ে দেওয়ার জন্য মাত্র একটি মডেল এবং যে কোনও জায়গায় থাকতে পারে। আপনি আপনার কন্ট্রোলারে উপরোক্ত শ্রেণীর একটি নতুন উদাহরণ ফিরে পাবেন। তবে সত্যি কথা বলতে আমি যখনই সম্ভব ক্লাসগুলিতে বিল্টটি ব্যবহার করার চেষ্টা করি: এটি.ওক (), ক্রিয়েটেডআউটরুট (), নটফাউন্ড ()। পদ্ধতির স্বাক্ষর হবে IHttpActionResult। তারা নেটকোরের সাথে এই সমস্ত কিছু পরিবর্তন করেছেন কিনা তা জানেন না
টমাস

-2

এই ত্রুটিগুলির জন্য যেখানে মডেলস্টেট.আইএসএলটি মিথ্যা, কোডটি নিক্ষেপ করার সাথে সাথে আমি সাধারণত ত্রুটিটি প্রেরণ করি। বিকাশকারী যারা আমার পরিষেবা গ্রাস করছেন তার পক্ষে এটি বোঝা সহজ। আমি সাধারণত নীচের কোড ব্যবহার করে ফলাফলটি প্রেরণ করি।

     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 অবজেক্ট (বা এটি এক্সএমএল যদি নির্বাচিত ফর্ম্যাট হয়) ফেরত পাঠানো উচিত।
সুধাংশু মিশ্র

বাহ্যিক এপিআই-র জন্য এই ব্যতিক্রমটি সঠিক পাঠানো হয়নি। তবে আপনি এটি অভ্যন্তরীণ এপিআই এবং পরীক্ষার সময় সমস্যাগুলি ডিবাগ করতে ব্যবহার করতে পারেন।
আশীষ সাহু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.