এনএসিউরসুসেসটাসটাস কোডের ব্যবহার এবং এইচটিপিপিউকুয়েস্টএক্সপেশন হ্যান্ডলিং এটি ছুঁড়ে দেয়


107

এর ব্যবহারের ধরণটি কী HttpResponseMessage.EnsureSuccessStatusCode()? এটি বার্তাটির সামগ্রীটি অপসারণ করে এবং ছোঁড়ে HttpRequestException, তবে কীভাবে জেনেরিকের তুলনায় এটি কোনও প্রোগ্রামিয়ালি হ্যান্ডেল করা যায় তা আমি দেখতে ব্যর্থ Exception। উদাহরণস্বরূপ, এটিতে অন্তর্ভুক্ত নেই HttpStatusCode, যা কার্যকর ছিল।

এটি থেকে আরও তথ্য পাওয়ার কোনও উপায় আছে কি? কেউ কি উভয়ের প্রাসঙ্গিক ব্যবহারের ধরণ EnsureSuccessStatusCode()এবং HttpRequestException দেখাতে পারে?

উত্তর:


158

এর কথ্য ব্যবহার EnsureSuccessStatusCodeসংক্ষেপে একটি অনুরোধ সাফল্যের যাচাই করার জন্য যখন আপনি কোন নির্দিষ্ট ভাবে ব্যর্থতা মামলা পরিচালনা করতে না চান হয়। এটি বিশেষত কার্যকর যখন আপনি কোনও ক্লায়েন্টকে দ্রুত প্রোটোটাইপ করতে চান।

আপনি যখন সিদ্ধান্ত নেন যে আপনি ব্যর্থতার কেসগুলি একটি নির্দিষ্ট উপায়ে পরিচালনা করতে চান, নিম্নলিখিতগুলি করবেন না

var response = await client.GetAsync(...);
try
{
    response.EnsureSuccessStatusCode();
    // Handle success
}
catch (HttpRequestException)
{
    // Handle failure
}

এটি অবিলম্বে এটি ধরার জন্য এটি একটি ব্যতিক্রম ছুঁড়ে দেয় যা কোনও অর্থ দেয় না। IsSuccessStatusCodeসম্পত্তির HttpResponseMessageএই কাজের জন্য নেই। পরিবর্তে নিম্নলিখিতটি করুন।

var response = await client.GetAsync(...);
if (response.IsSuccessStatusCode)
{
    // Handle success
}
else
{
    // Handle failure
}

4
আসল পূর্ণসংখ্যার স্থিতি কোড পাওয়ার কোনও উপায় আছে কি ? আমি যখন এটি চেষ্টা করি তখন আমি 404 স্থিতির কোডের পরিবর্তে "নটফাউন্ড" এর মতো স্ট্রিং পাই।
নিকজি

12
@NickG (int)response.StatusCode(দেখুন msdn.microsoft.com/en-us/library/... )
টিমোথি ঢাল

4
দ্রষ্টব্য, EnsureSuccessStatusCode () দ্বারা ছুঁড়ে ফেলা ডিফল্ট এইচটিটিপিআরেক্সেস্টেপশনটির কারণ বাক্যাংশ থাকবে। তবে সফল না হলে প্রতিক্রিয়াতে আপনি সেই সম্পত্তিটি অ্যাক্সেস করতে পারেন।
স্টিফান জাভোনার

@ টিমোথিশিল্ডস দ্রুত প্রোটোটাইপিংয়ের অনুমতি দেওয়ার জন্য আমি আপনার রঙের প্রশংসা করি। কেন আপনাকে প্রথমে পড়তে না response.Contentমধ্যে জাম্পিং আগে মান // Handle successএবং // Handle failureব্লক? এইভাবে, আপনি কেবল response.Contentএকবার সম্পত্তি পড়বেন । আমি এইভাবে এটি করতে কেবলমাত্র ক্ষতি দেখতে পাচ্ছি যদি বিষয়বস্তুর সম্পত্তিটি একটি দীর্ঘ স্ট্রিং হয় তবে আপনি মূলত ক্লায়েন্টকে ধীর করে দিচ্ছেন তবে আপনি যদি গতি সম্পর্কে উদ্বিগ্ন হন তবে কেন কেবল ব্যবহার response.EnsureSuccessStatusCode();করবেন না ?
জন জাব্রোস্কি

আমি নীচে নীচে EnsureSuccessStatusCode এর নিজস্ব সংস্করণ লিখেছি। stackoverflow.com/a/63476616/1040437Content স্থিতি যাচাই করার আগে দায়িত্বটি কলারের কাছে অর্পণ করে ।
জন জাব্রোস্কি

97

আমি এনসুরসুকসেসটাসটাসকোড পছন্দ করি না কারণ এটি কোনও অর্থ ফেরত দেয় না। এজন্য আমি আমার নিজস্ব এক্সটেনশন তৈরি করেছি:

public static class HttpResponseMessageExtensions
{
    public static async Task EnsureSuccessStatusCodeAsync(this HttpResponseMessage response)
    {
        if (response.IsSuccessStatusCode)
        {
            return;
        }

        var content = await response.Content.ReadAsStringAsync();

        if (response.Content != null)
            response.Content.Dispose();

        throw new SimpleHttpResponseException(response.StatusCode, content);
    }
}

public class SimpleHttpResponseException : Exception
{
    public HttpStatusCode StatusCode { get; private set; }

    public SimpleHttpResponseException(HttpStatusCode statusCode, string content) : base(content)
    {
        StatusCode = statusCode;
    }
}

মাইক্রোসফ্ট এর এনসুরসুসেসটাসটাসকোডের উত্স কোডটি এখানে পাওয়া যাবে

SO লিঙ্কের উপর ভিত্তি করে সিঙ্ক্রোনাস সংস্করণ :

public static void EnsureSuccessStatusCode(this HttpResponseMessage response)
{
    if (response.IsSuccessStatusCode)
    {
        return;
    }

    var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

    if (response.Content != null)
        response.Content.Dispose();

    throw new SimpleHttpResponseException(response.StatusCode, content);
}

ইসসুকসেসটাসটাসকোড সম্পর্কে আমি যা পছন্দ করি না তা হ'ল এটি "সুন্দরভাবে" পুনরায় ব্যবহারযোগ্য নয়। উদাহরণস্বরূপ, আপনি নেটওয়ার্ক সমস্যার ক্ষেত্রে কোনও অনুরোধের পুনরাবৃত্তি করতে পলির মতো লাইব্রেরি ব্যবহার করতে পারেন । সেক্ষেত্রে আপনাকে ব্যতিক্রম বাড়াতে আপনার কোডের প্রয়োজন যাতে পলি বা অন্য কোনও গ্রন্থাগার এটি পরিচালনা করতে পারে ...


4
সম্মতি জানুন, প্রত্যাবর্তন থেকে অর্থবহ বার্তা পেতে ডিফল্ট কোডটি বৈশিষ্ট্যটি অনুপস্থিত।
এলটি

4
আপনার সংস্করণটি মূল বাস্তবায়নের চেয়ে আলাদা কাজ করে EnsureSuccessStatusCode। আপনি সর্বদা নিষ্পত্তি করুন response.Content(কারণ শেষ পর্যন্ত return;বিবৃতি দেওয়ার পরেও সর্বদা ডাকা হয় ) এবং এটি আরও পড়ার জন্য সামগ্রীটিকে নষ্ট করে দেয়। মূল বাস্তবায়ন কেবল তখনই সামগ্রীটিকে নিষ্পত্তি করে দেয় যখন স্থিতি কোড সফল ফলাফল নির্দেশ করে না।
Lukas.Navratil

4
আপনি প্রথমে কেন পাচ্ছেন না await response.Content.ReadAsStringAsync()এবং তারপরে চেক করুনif (response.Content != null)
মাফু

4
পলি এখন এই ধরণের দৃশ্যে সহায়তা করার জন্য অবিকল ফলাফলগুলি এবং ব্যতিক্রমগুলি পরিচালনা করে। আপনি HttpRequestকলগুলি সুরক্ষার জন্য পলি কনফিগার করতে পারেন এবং কিছু ব্যতিক্রম এবং কিছু নির্দিষ্ট ও HttpResponseCodeগুলি পরিচালনা করতে উভয়কেই নীতিটি কনফিগার করতে পারেন । দেখুন পলি উদাহরণ রিডমি এখানে
পর্বত পান্থ

4
কীভাবে response.Contentশূন্য হতে পারে যখন এটির সবেমাত্র কোনও পদ্ধতি ডেকে আনা হয়েছে?
ইয়ান ওয়ারবার্টন

1

আমি যখন একই পদ্ধতিতে ব্যাতিক্রমটি পরিচালনা করতে চাই না তখন আমি এনসুরসুকসেসটাসটাসকোড ব্যবহার করি।

public async Task DoSomethingAsync(User user)
{
    try
    {
        ...
        var userId = await GetUserIdAsync(user)
        ...
    }
    catch(Exception e)
    {
        throw;
    }
}

public async Task GetUserIdAsync(User user)
{
    using(var client = new HttpClient())
    {
        ...
        response = await client.PostAsync(_url, context);

        response.EnsureSuccesStatusCode();
        ...
    }
}

GetUserIdAsync এ ছাপানো ব্যতিক্রমটি DoSomethingAsync এ পরিচালনা করা হবে।


1

নীচে আমার প্রস্তাবিত সমাধান। একমাত্র ত্রুটিটি হ'ল যেহেতু এএসপি.এনইটি কোর ফ্রেমওয়ার্ক রিসোর্স ম্যানেজারটি কাঠামোর অভ্যন্তরীণ, তাই আমি সরাসরি মাইক্রোসফ্টের আন্তর্জাতিকীকৃত বার্তা স্ট্রিংগুলি পুনরায় ব্যবহার করতে পারি না, তাই আমি এখানে কেবল ভারব্যাটিম ইংলিশ বার্তাটি আক্ষরিক ব্যবহার করছি।

পেশাদাররা

  • 5XX সার্ভার ত্রুটির জন্য সামগ্রীটি লগ করে
    • কখনও কখনও, একটি সার্ভার ত্রুটি আসলে ছদ্মবেশে একটি ক্লায়েন্ট ত্রুটি, যেমন ক্লায়েন্ট অবহেলিত শেষ পয়েন্ট ব্যবহার করে যা অবশেষে বন্ধ হয়ে যায়।
  • ইন্টিগ্রেশন টেস্ট ব্যবহার করে লেখার সময় ত্রুটিগুলি অনাবৃত করা সহজ করে তোলে ConfigureTestContainer<T>

কনস

  • অপারগ।
    • আপনি যদি প্রতিক্রিয়া সামগ্রীটি পড়েন এবং সামগ্রীটি খুব দীর্ঘ হয় তবে আপনি ক্লায়েন্টকে ধীর করে দেবেন। কিছু ক্লায়েন্টের জন্য, নরম রিয়েল-টাইম প্রতিক্রিয়া প্রয়োজনীয়তা সহ, এই জটটি অগ্রহণযোগ্য হতে পারে।
  • ত্রুটি লগইন এবং পর্যবেক্ষণের জন্য ভুল দায়িত্ব।
    • এটি যদি 5XX সার্ভার ত্রুটি হয় তবে ক্লায়েন্ট কোনও ক্ষতি করে নি বলে ক্লায়েন্ট কেন যত্ন করে? কেবল কল করুন response.EnsureSuccessStatusCode();এবং সার্ভারকে এটি মোকাবেলা করতে দিন।
    • কোনও অভ্যন্তরীণ সার্ভার ত্রুটি থাকা অবস্থায় কেবল সার্ভার ত্রুটিযুক্ত লগগুলি কেন পরীক্ষা করবেন না?
  • Contentস্থিতি পরীক্ষা করার আগে সম্পত্তিটি পড়া দরকার । এমন পরিস্থিতি থাকতে পারে যেখানে এটি কাঙ্ক্ষিত নয়, এর মধ্যে একটি হ'ল অদক্ষতা।

ব্যবহার

using (var requestMessage = new HttpRequestMessage(HttpMethod.Post, "controller/action"))
{
  using (var response = await HttpClient.SendAsync(requestMessage))
  {
    var content = await response.Content.ReadAsStringAsync();
    response.EnsureSuccessStatusCode2(content);
    var result = JsonConvert.DeserializeObject<ResponseClass>(content);
  }
}

এপিআই

    public static class HttpResponseMessageExtensions
    {
        public static void EnsureSuccessStatusCode2(this HttpResponseMessage message, string content = null)
        {
            if (message.IsSuccessStatusCode)
                return;
            var contentMessage = string.IsNullOrWhiteSpace(content) ? string.Empty : $"Content: {content}";
            throw new HttpRequestException(string.Format(
                System.Globalization.CultureInfo.InvariantCulture,
                "Response status code does not indicate success: {0} ({1}).{2}",
                (int)message.StatusCode,
                message.ReasonPhrase,
                contentMessage)
                );
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.