এএসপি.নেট ওয়েব এপিআই-তে এক্সেসপশন হ্যান্ডলিংয়ের একটি নিবন্ধ পর্যালোচনা করার পরে আমি কখন একটি ব্যতিক্রম ত্রুটি প্রতিক্রিয়া ফিরিয়ে আনব তা নিয়ে কিছুটা বিভ্রান্ত হয়ে পড়েছি। আমি যখন আপনার পদ্ধতিটি পরিবর্তে কোনও ডোমেন নির্দিষ্ট মডেলটি ফেরত দেয় তখন প্রতিক্রিয়াটি সংশোধন করা সম্ভব কিনা তা নিয়েও আমি ভাবছি HttpResponseMessage
...
সুতরাং, এখানে পুনরুদ্ধার করার জন্য আমার প্রশ্নগুলি # কেস # সহ কিছু কোড অনুসরণ করে:
প্রশ্নাবলি
মামলা # 1 সম্পর্কিত প্রশ্নসমূহ
- আমার কী সর্বদা
HttpResponseMessage
কংক্রিট ডোমেন মডেলের পরিবর্তে ব্যবহার করা উচিত, যাতে বার্তাটি কাস্টমাইজ করা যায়? - আপনি যদি কংক্রিটের ডোমেন মডেলটি ফিরিয়ে দিচ্ছেন তবে বার্তাটি কাস্টমাইজ করা যায়?
কেস # 2,3,4 সম্পর্কিত প্রশ্নাবলী
- আমি কি একটি ব্যতিক্রম ছোঁড়া বা ত্রুটি প্রতিক্রিয়া ফেরত করা উচিত? যদি উত্তরটি "এটি নির্ভর করে" হয় তবে আপনি কখন একটির তুলনায় অন্যটিকে ব্যবহার করতে পারেন সে সম্পর্কে পরিস্থিতি / উদাহরণ দিতে পারেন।
HttpResponseException
বনাম ছুড়ে দেওয়ার মধ্যে পার্থক্য কীRequest.CreateErrorResponse
? ক্লায়েন্টের কাছে আউটপুট অভিন্ন বলে মনে হচ্ছে ...- আমি কি সবসময়
HttpError
ত্রুটিগুলিতে প্রতিক্রিয়া বার্তাগুলি "মোড়ানো" ব্যবহার করি (ব্যতিক্রম নিক্ষিপ্ত হয় বা ত্রুটির প্রতিক্রিয়া ফিরে আসে কিনা)?
কেস নমুনা
// CASE #1
public Customer Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var notFoundResponse = new HttpResponseMessage(HttpStatusCode.NotFound);
throw new HttpResponseException(notFoundResponse);
}
//var response = Request.CreateResponse(HttpStatusCode.OK, customer);
//response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return customer;
}
// CASE #2
public HttpResponseMessage Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var notFoundResponse = new HttpResponseMessage(HttpStatusCode.NotFound);
throw new HttpResponseException(notFoundResponse);
}
var response = Request.CreateResponse(HttpStatusCode.OK, customer);
response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return response;
}
// CASE #3
public HttpResponseMessage Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var message = String.Format("customer with id: {0} was not found", id);
var errorResponse = Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
throw new HttpResponseException(errorResponse);
}
var response = Request.CreateResponse(HttpStatusCode.OK, customer);
response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return response;
}
// CASE #4
public HttpResponseMessage Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var message = String.Format("customer with id: {0} was not found", id);
var httpError = new HttpError(message);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, httpError);
}
var response = Request.CreateResponse(HttpStatusCode.OK, customer);
response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return response;
}
হালনাগাদ
কেসগুলি আরও প্রদর্শন করতে সহায়তার জন্য # 2,3,4 নিম্নলিখিত কোড স্নিপেট গ্রাহককে পাওয়া না গেলে "ঘটতে পারে" এমন কয়েকটি বিকল্প হাইলাইট করে ...
if (customer == null)
{
// which of these 4 options is the best strategy for Web API?
// option 1 (throw)
var notFoundMessage = new HttpResponseMessage(HttpStatusCode.NotFound);
throw new HttpResponseException(notFoundMessage);
// option 2 (throw w/ HttpError)
var message = String.Format("Customer with id: {0} was not found", id);
var httpError = new HttpError(message);
var errorResponse = Request.CreateErrorResponse(HttpStatusCode.NotFound, httpError);
throw new HttpResponseException(errorResponse);
// option 3 (return)
var message = String.Format("Customer with id: {0} was not found", id);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
// option 4 (return w/ HttpError)
var message = String.Format("Customer with id: {0} was not found", id);
var httpError = new HttpError(message);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, httpError);
}