আমি এইচটিটিপিআরসপোনসমেসেজের পরিবর্তে আইএইচটিপিএक्शनআরসাল্ট ব্যবহার করব কেন?


326

আমি WebApi এর সাথে বিকাশ করছি এবং WebApi2 এ চলেছি যেখানে মাইক্রোসফ্ট একটি নতুন IHttpActionResultইন্টারফেস চালু করেছে যা দেখে মনে হয় যে এটি ফেরত দেওয়ার ক্ষেত্রে ব্যবহার করা উচিত HttpResponseMessage। এই নতুন ইন্টারফেসের সুবিধার জন্য আমি বিভ্রান্ত। দেখে মনে হচ্ছে এটি তৈরির জন্য খুব সহজ একটি সহজ উপায় সরবরাহ করা হয়েছে HttpResponseMessage

আমি যুক্তিটি বলব যে এটি "বিমূর্ততার জন্য বিমূর্ততা"। আমি কিছু অনুপস্থিত করছি? কোডের একটি লাইন সংরক্ষণের পাশাপাশি এই নতুন ইন্টারফেসটি ব্যবহার করে আমি আসল বিশ্বের সুবিধা কী পেতে পারি?

পুরানো উপায় (ওয়েবএপি):

public HttpResponseMessage Delete(int id)
{
    var status = _Repository.DeleteCustomer(id);
    if (status)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
    else
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

নতুন উপায় (WebApi2):

public IHttpActionResult Delete(int id)
{
    var status = _Repository.DeleteCustomer(id);
    if (status)
    {
        //return new HttpResponseMessage(HttpStatusCode.OK);
        return Ok();
    }
    else
    {
        //throw new HttpResponseException(HttpStatusCode.NotFound);
        return NotFound();
    }
}

আমি সবেমাত্র আকর্ষণীয় কিছু পেয়েছি। এই ফলাফলগুলি অন্য কারও দ্বারা যাচাই করা যায় কিনা তা আমি নিশ্চিত নই। তবে কিছু কল দিয়ে আমি পারফরম্যান্সে অনেক উন্নতি করেছি: * উদাহরণ হিসাবে HttpResponseMessageআমি 9545 এমএসে প্রতিক্রিয়া পেয়েছি । * IHttpActionResultআমি ব্যবহার করে 294 এমএসে একই প্রতিক্রিয়া পেয়েছি ।
ক্রিস লেজ কম

@ ক্রিসলেজ 9545 এমএস প্রায় 10 সেকেন্ডের। এমনকি 294ms ধীর ধরণের। আপনার যদি 100 মিটারের বেশি গ্রহণের কিছু থাকে তবে সেখানে অন্য কিছু কাজ চলছে। এই গল্পটির সাথে মিলিত হওয়ার চেয়েও বেশি কিছু আছে।
অ্যারোনএলএস

উত্তর:


305

আপনি ব্যবহার না করার সিদ্ধান্ত নিতে পারেন IHttpActionResultকারণ আপনার বিদ্যমান কোডটি HttpResponseMessageএমন একটি তৈরি করে যা কোনও কোনও ক্যানড প্রতিক্রিয়াগুলিতে ফিট করে না। তবে আপনি এর ক্যানড প্রতিক্রিয়া ব্যবহার করে মানিয়ে নিতে HttpResponseMessageপারেন । এটি বের করতে আমার কিছুটা সময় লেগেছে, সুতরাং আমি এটি পোস্ট করে দেখতে চাইছিলাম যে আপনাকে সম্ভবত একটি বা অন্যটি বেছে নেওয়ার দরকার নেই:IHttpActionResultResponseMessage

public IHttpActionResult SomeAction()
{
   IHttpActionResult response;
   //we want a 303 with the ability to set location
   HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.RedirectMethod);
   responseMsg.Headers.Location = new Uri("http://customLocation.blah");
   response = ResponseMessage(responseMsg);
   return response;
}

দ্রষ্টব্য, আপনার নিয়ামককে উত্তরাধিকার সূত্রে প্রাপ্ত ResponseMessageবেস বেসের একটি পদ্ধতি ApiController


1
আমাকে রেসপন্সমেসেজটি এখন রেসপন্সমেসেজের রেজাল্ট হিসাবে সন্ধান করার জন্য সময় নিয়েছিল। সম্ভবত এটির নামকরণ হয়েছে সম্প্রতি? পিএস আপনি উত্তরে একটি নতুন কীওয়ার্ডও মিস করেছেন এবং পরামর্শের জন্য অনেক ধন্যবাদ :)
ইলিয়া চেরনমর্ডিক

10
@ ইলিয়াচর্নমর্ডিক ResponseMessageএবং ResponseMessageResultদুটি ভিন্ন জিনিস। ResponseMessage()একটি হল পদ্ধতি এর ApiControllerযা আপনার নিয়ামক থেকে উত্তরাধিকারী উচিত, এবং সেইজন্য শুধু একটি পদ্ধতি আহবান। সুতরাং newসেখানে কোনও কীওয়ার্ডের প্রয়োজন নেই। আপনি সম্ভবত উত্তরাধিকার সূত্রে প্রাপ্ত নন ApiControllerবা আপনি একটি স্থির পদ্ধতির অভ্যন্তরে রয়েছেন। ResponseMessageResultএর রিটার্ন টাইপ ResponseMessage()
অ্যারোনএলএস

3
আমি লিখতে পারতাম response = base.ResponseMessage(responseMsg) এটি আরও পরিষ্কার করে পারি যে এটি বেস ক্লাসের এপি কন্ট্রোলারের একটি পদ্ধতি
অ্যারোনলএস

ধন্যবাদ, আমার কাছে এমন একটি পরিষেবা ছিল যা এপিকন্ট্রোলারের কাছ থেকে উত্তরাধিকার সূত্রে আসে নি, এজন্য এটি পেতে কিছুটা সময় নিয়েছিল।
ইলিয়া চেরনমর্ডিক

3
@ পুটজকো আপনি ঠিক বলেছেন, আমি ওপিকে বোঝাচ্ছিলাম যে তারা দু'টি পদ্ধতির "পুরানো পথ" বনাম "নতুন উপায়" হিসাবে ফ্রেমিং করে পারস্পরিকভাবে একচেটিয়া ছিল যখন তারা বাস্তবে ছিল না। আমি মনে করি ড্যারেলের উত্তর IHttpActionResult ফিরিয়ে দেওয়ার কিছু সুবিধাগুলির ব্যাখ্যা করার ভাল কাজ করে এবং আমার উত্তরটি প্রমাণ করে যে আপনি কীভাবে পুরানো এইচটিটিপিআরসপনসেসকে একটি আইএইচটিপিএকশনরেসালটে রূপান্তর করতে সক্ষম হবেন যাতে আপনি উভয় বিশ্বের সেরা থাকতে পারেন।
অ্যারোনএলএস

84

আপনি এখনও ব্যবহার করতে পারেন HttpResponseMessage। সেই ক্ষমতা চলে যাবে না will আমি আপনার মত একইভাবে অনুভব করেছি এবং দলের সাথে বিস্তৃতভাবে তর্ক করেছি যে অতিরিক্ত বিমূর্ততার কোনও প্রয়োজন নেই। এর অস্তিত্বের ন্যায্যতা প্রমাণ করার জন্য চারপাশে কয়েকটি যুক্তি ছুঁড়েছিল তবে কিছুই আমাকে বিশ্বাস করেনি যে এটি সার্থক ছিল।

এটি হ'ল ব্র্যাড উইলসনের এই নমুনাটি না পাওয়া পর্যন্ত । যদি আপনি এমনভাবে ক্লাস নির্মাণ করেন যাতে শৃঙ্খলাবদ্ধ হতে পারে তবে আপনি উত্পাদন করার জন্য "অ্যাকশন-স্তর" প্রতিক্রিয়া পাইপলাইন তৈরি করার ক্ষমতা অর্জন করবেন । কভারগুলির অধীনে, তবে এটি কীভাবে কার্যকর করা হয়, অ্যাকশন পদ্ধতিটি পড়ার সময় সেগুলির ক্রমটি সুস্পষ্ট নয় যা একটি কারণ যা আমি অ্যাকশন ফিল্টারগুলির অনুরাগী নই।IHttpActionResultHttpResponseMessageActionFiltersActionFilters

যাইহোক, IHttpActionResultআপনার ক্রিয়া পদ্ধতিতে স্পষ্টভাবে শৃঙ্খলাবদ্ধ হতে পারে এমন একটি তৈরি করে আপনি আপনার প্রতিক্রিয়া উত্পন্ন করতে সমস্ত ধরণের বিভিন্ন আচরণ রচনা করতে পারেন।


62

এখানে বেশ কয়েকটি সুবিধা হয় IHttpActionResultবেশি HttpResponseMessageউল্লেখ মাইক্রোসফট ASP.Net ডকুমেন্টেশন :

  • আপনার নিয়ন্ত্রকদের পরীক্ষার ইউনিটকে সহজতর করে।
  • পৃথক শ্রেণিতে HTTP প্রতিক্রিয়া তৈরি করার জন্য সাধারণ যুক্তি সরিয়ে দেয়।
  • প্রতিক্রিয়া তৈরির নিম্ন-স্তরের বিশদটি গোপন করে কন্ট্রোলার অ্যাকশনকে আরও পরিষ্কার করার উদ্দেশ্য তৈরি করে।

তবে এখানে IHttpActionResultউল্লেখযোগ্যভাবে ব্যবহার করার আরও কিছু সুবিধা রয়েছে :

  • একক দায়িত্বের নীতিকে সম্মান জানানো : ক্রিয়াকলাপগুলির জন্য HTTP অনুরোধগুলি পরিবেশন করার দায়বদ্ধতা সৃষ্টি করুন এবং HTTP প্রতিক্রিয়া বার্তা তৈরিতে তাদের জড়িত করবেন না।
  • ইতিমধ্যে সিস্টেমে সংজ্ঞায়িত কার্যকর বাস্তবায়ন e ওয়েব.এইচটিপি। ফলাফলগুলি: Ok NotFound Exception Unauthorized BadRequest Conflict Redirect InvalidModelState( সম্পূর্ণ তালিকার লিঙ্ক )
  • ডিফল্টরূপে অ্যাসিঙ্ক এবং অ্যাওয়েট ব্যবহার করে।
  • কেবল ExecuteAsyncপদ্ধতি প্রয়োগ করে নিজের অ্যাকশনারসাল্ট তৈরি করা সহজ
  • আপনি ব্যবহার করতে পারেন ResponseMessageResult ResponseMessage(HttpResponseMessage response)থেকে IHttpActionResult করার HttpResponseMessage রূপান্তর


18

এটি কেবল আমার ব্যক্তিগত মতামত এবং ওয়েব এপিআই টিমের লোকেরা সম্ভবত এটি আরও ভালভাবে ব্যাখ্যা করতে পারে তবে এখানে আমার 2 সি রয়েছে।

প্রথমত, আমি মনে করি এটি একে অপরের প্রশ্ন নয়। আপনি উভয় আপনি আপনার কর্ম পদ্ধতিতে কাজ করতে চান কিন্তু আদেশের প্রকৃত শক্তি বুঝতে নির্ভর করে তাদের ব্যবহার করতে পারেন IHttpActionResult, আপনি সম্ভবত সেই সুবিধাজনক সাহায্যকারী পদ্ধতি বাহিরে পদক্ষেপ করতে হবে ApiControllerযেমন Ok, NotFoundইত্যাদি

মূলত, আমি মনে করি একটি শ্রেণী IHttpActionResultকারখানার হিসাবে বাস্তবায়ন করছেHttpResponseMessage । সেই মন সেট করার সাথে সাথে এটি এখন এমন একটি বস্তু হয়ে ওঠে যা ফেরত দেওয়া দরকার এবং একটি কারখানা যা এটি উত্পাদন করে। সাধারণ প্রোগ্রামিং অর্থে, আপনি নির্দিষ্ট ক্ষেত্রে এবং নির্দিষ্ট ক্ষেত্রে নিজেকে অবজেক্টটি তৈরি করতে পারেন, এটি করার জন্য আপনার একটি কারখানা প্রয়োজন need একই অবস্থা.

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

IHttpActionResultরিটার্ন টাইপ হিসাবে ব্যবহারের আর একটি সুবিধা হ'ল এটি এএসপি.নেট ওয়েব এপিআই অ্যাকশন পদ্ধতিটিকে এমভিসির অনুরূপ করে। আপনি মিডিয়া ফর্ম্যাটারে না গিয়ে যে কোনও ক্রিয়াকলাপের ফলাফল দিতে পারেন।

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

দীর্ঘ গল্প সংক্ষিপ্ত - এটি IHttpActionResultবনাম নয় HttpResponseMessage। মূলত, আপনি প্রতিক্রিয়াটি তৈরি করতে চান এটি। এটি নিজে বা কারখানার মাধ্যমে করুন।


কারখানার ন্যায়বিচারের সাথে আমার যে সমস্যাটি হয়েছিল তা হ'ল আমি সহজেই ResponseFactory.CreateOkResponse()এই রিটার্ন HttpResponseMessage এর মতো স্থিতিশীল পদ্ধতি তৈরি করতে পারি এবং প্রতিক্রিয়া তৈরি করার সময় আমাকে অ্যাসিঙ্ক স্টাফের সাথে ডিল করতে হয়নি। একটি দলের সদস্য এই বিষয়টি উল্লেখ করেছিলেন যে শিরোনামের মানগুলি তৈরি করতে যদি আপনাকে I / O করতে হয় তবে অ্যাসিঙ্কটি কার্যকর হতে পারে। যদিও কতবার এটি ঘটে তা নিশ্চিত নয় Not
ড্যারেল মিলার

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

6

: ওয়েব এপিআই মূলত বস্তুর 4 টাইপ আসতে void, HttpResponseMessage, IHttpActionResult, এবং অন্যান্য শক্তিশালী ধরনের। ওয়েব এপিআইর প্রথম সংস্করণটি প্রত্যাবর্তন করে HttpResponseMessageযা বেশ সোজা এগিয়ে এইচটিটিপি প্রতিক্রিয়া বার্তা।

IHttpActionResultWebAPI 2 যার মোড়ানো এক ধরনের প্রবর্তন করেন HttpResponseMessage। এটিতে ExecuteAsync()একটি তৈরির পদ্ধতি রয়েছে HttpResponseMessage। এটি আপনার নিয়ামকের ইউনিট পরীক্ষা সহজতর করে।

অন্যান্য রিটার্নের ধরণগুলি প্রতিক্রিয়া বডিতে মিডিয়া ফর্ম্যাটর ব্যবহার করে ওয়েব এপিআই দ্বারা সিরিয়ালযুক্ত শক্তিশালী টাইপযুক্ত ক্লাস। অপূর্ণতাটি হ'ল আপনি 404 এর মতো কোনও ত্রুটি কোড সরাসরি ফিরিয়ে দিতে পারবেন না you আপনি যা করতে পারেন তা একটি HttpResponseExceptionত্রুটি নিক্ষেপ করছে ।


3

আমি বরং IHttpActionResult এর জন্য TaskExecuteAsync ইন্টারফেস ফাংশন বাস্তবায়ন করব। কিছুটা এইরকম:

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = _request.CreateResponse(HttpStatusCode.InternalServerError, _respContent);

        switch ((Int32)_respContent.Code)
        { 
            case 1:
            case 6:
            case 7:
                response = _request.CreateResponse(HttpStatusCode.InternalServerError, _respContent);
                break;
            case 2:
            case 3:
            case 4:
                response = _request.CreateResponse(HttpStatusCode.BadRequest, _respContent);
                break;
        } 

        return Task.FromResult(response);
    }

, যেখানে _এইচটিএইচটিপিআরকোয়েস্ট এবং _সারণহেতু হ'ল পেড।


2

আমাদের IHttpActionResultওভার ব্যবহারের নিম্নলিখিত সুবিধা রয়েছে HttpResponseMessage:

  1. ব্যবহার করে IHttpActionResultআমরা কেবলমাত্র ডেটাতে মনোনিবেশ করছি যাতে স্থিতি কোডে না পাঠানো হয়। সুতরাং এখানে কোডটি ক্লিনার এবং বজায় রাখা খুব সহজ হবে।
  2. বাস্তবায়িত নিয়ামক পদ্ধতির ইউনিট পরীক্ষা করা আরও সহজ হবে।
  3. ব্যবহার asyncএবং awaitডিফল্টরূপে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.