ওয়েবক্লিয়েন্ট থেকে স্ট্যাটাস কোড কীভাবে পাবেন?


90

আমি WebClientওয়েব ফর্মটিতে কিছু তথ্য পোস্ট করতে ক্লাসটি ব্যবহার করছি । আমি ফর্ম জমা দেওয়ার প্রতিক্রিয়া স্থিতি কোড পেতে চাই। এখনও অবধি আমি খুঁজে পেয়েছি যদি কোনও ব্যতিক্রম থাকে তবে কীভাবে স্থিতি কোড পাবেন

Catch wex As WebException
        If TypeOf wex.Response Is HttpWebResponse Then
          msgbox(DirectCast(wex.Response, HttpWebResponse).StatusCode)
            End If

তবে যদি ফর্মটি সফলভাবে জমা দেওয়া হয় এবং কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হয় তবে আমি স্থিতি কোডটি জানতে পারি না (200,301,302, ...)

কোনও ব্যতিক্রম নিক্ষেপ না হলে স্ট্যাটাস কোড পাওয়ার কোনও উপায় আছে?

PS: আমি httpwebrequest / httpwebresponse ব্যবহার না করা পছন্দ করি

উত্তর:


23

চেষ্টা করে দেখলাম। রেসপন্সহেইডারগুলি স্থিতি কোড অন্তর্ভুক্ত করে না।

যদি আমি ভুল না হয়ে থাকি তবে WebClientএকক পদ্ধতিতে কলটিতে একাধিক স্বতন্ত্র অনুরোধগুলি বিমূর্ত করতে সক্ষম (যেমন সঠিকভাবে 100 চালিয়ে যাওয়া প্রতিক্রিয়াগুলি, পুনঃনির্দেশগুলি এবং এই জাতীয় পছন্দগুলি পরিচালনা করা)। আমি সন্দেহ করি যে ব্যবহার না করে HttpWebRequestএবং HttpWebResponse, একটি স্বতন্ত্র স্থিতি কোড পাওয়া যাবে না।

আমার কাছে এটি ঘটে যে আপনি যদি মধ্যবর্তী স্থিতি কোডগুলিতে আগ্রহী না হন তবে আপনি নিরাপদে চূড়ান্ত স্থিতি কোডটি 2XX (সফল) পরিসীমাতে ধরে নিতে পারেন, অন্যথায়, কলটি সফল হবে না।

দুর্ভাগ্যক্রমে স্ট্যাটাস কোড ResponseHeadersঅভিধানে উপস্থিত নেই ।


4
মনে হচ্ছে যে একমাত্র উপায় হবে webrequest / প্রতিক্রিয়া
Julio

4
আপনি যদি আরও 200 টি সিরিজের বার্তাটি স্পষ্টভাবে খুঁজছেন তবে সমস্যাটি মনে হচ্ছে (যেমন 201 তৈরি করা হয়েছে - দেখুন: w3.org/Protocols/rfc2616/rfc2616-sec10.html )। : - / "ইন্টারমিডিয়েট" বাদ না দেওয়া সত্ত্বেও যদি তা স্পষ্টভাবে উপলব্ধ হয় তবে এটি দুর্দান্ত হবে।
নর্মান এইচ

4
@ নরমানহ, আমি একমত নই এটি মনে হয় যে ওয়েবক্লিয়েন্ট হ'ল স্থিতির কোডগুলির ক্ষেত্রে কিছুটা ফাঁস বিমূর্ততা। চিয়ার্স!
kbrimington

87

ত্রুটিটি টাইপের কিনা তা আপনি পরীক্ষা করে দেখতে পারেন WebExceptionএবং তারপরে প্রতিক্রিয়া কোডটি পরিদর্শন করতে পারেন;

if (e.Error.GetType().Name == "WebException")
{
   WebException we = (WebException)e.Error;
   HttpWebResponse response = (System.Net.HttpWebResponse)we.Response;
   if (response.StatusCode==HttpStatusCode.NotFound)
      System.Diagnostics.Debug.WriteLine("Not found!");
}

বা

try
{
    // send request
}
catch (WebException e)
{
    // check e.Status as above etc..
}

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

4
হ্যাঁ, সর্বোত্তম পন্থাটি হ'ল প্রতিক্রিয়ার ডেটা একবার চেষ্টা করে দেখুন এবং ওয়েবএক্সেপশন ধরুন
হেনরিক হার্টজ

4
আমি এখানে কিছু মিস করছি 'System.Exception' বা 'System.Net.Exception' এর মধ্যে 'ত্রুটি'র সংজ্ঞা নেই
গ্রেগ উডস

13
কলটি সফল হলে (যেমন 2xx বা 3xx ফেরৎ দেয়) ব্যতিক্রম হবে না। আসল পোস্টারটি 3xx সন্ধান করছিল, আমি ২০৪-এর সন্ধান করছি, অন্যান্য ব্যক্তিরা ২০১০-এর সন্ধান করছেন This এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না।
সাইমন ব্রুক

4
নিশ্চিত নয় যে এই উত্তরটি এতদূর কীভাবে আপলোড হয়েছিল যখন মূল পোস্টারটি লিখেছিল: "ব্যতিক্রম ছুঁড়ে না দেওয়া অবস্থায় স্থিতি কোড পাওয়ার কোনও উপায় আছে কি?" আমার ধারণা এখন ডাউনভোটিংয়ের কোনও অর্থ নেই।
ব্যাঙ pr1nce

33

প্রতিবিম্ব ব্যবহার করে এটি করার একটি উপায় আছে। .NET 4.0 এর সাথে এটি কাজ করে। এটি একটি ব্যক্তিগত ক্ষেত্র অ্যাক্সেস করে এবং কোনও পরিবর্তন ছাড়াই .NET এর অন্যান্য সংস্করণে কাজ করতে পারে না।

মাইক্রোসফ্ট কেন সম্পত্তি সহ এই ক্ষেত্রটি প্রকাশ করলো না আমার কোনও ধারণা নেই।

private static int GetStatusCode(WebClient client, out string statusDescription)
{
    FieldInfo responseField = client.GetType().GetField("m_WebResponse", BindingFlags.Instance | BindingFlags.NonPublic);

    if (responseField != null)
    {
        HttpWebResponse response = responseField.GetValue(client) as HttpWebResponse;

        if (response != null)
        {
            statusDescription = response.StatusDescription;
            return (int)response.StatusCode;
        }
    }

    statusDescription = null;
    return 0;
}

4
এফডাব্লুআইডাব্লু, উইন্ডোজ ফোনে এটি সম্ভব নয় যা প্রতিচ্ছবি দ্বারা এমনকি ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে দেয় না
ব্রেন্ডন

নোট করুন যে বাইন্ডিংফ্লাগগুলির জন্য "সিস্টেম ব্যবহার করা হয় efনির্ধারণ;"
ডিএলচাম্বার্স

চমৎকার, তবে সাবস্ট্যাটাসকোড পাওয়ার কোনও উপায় আছে কি? উদাহরণস্বরূপ 403.1 বা 403.2?
রনি তোভি

প্রতিক্রিয়া অবজেক্টে একটি সাবস্ট্যাটাসকোড সম্পত্তি রয়েছে। msdn.microsoft.com/en-us/library/…
দিমিত্রি এস

30

যদি আপনি। নেট 4.0 (বা তার চেয়ে কম) ব্যবহার করছেন:

class BetterWebClient : WebClient
{
        private WebRequest _Request = null;

        protected override WebRequest GetWebRequest(Uri address)
        {
            this._Request = base.GetWebRequest(address);

            if (this._Request is HttpWebRequest)
            {
                ((HttpWebRequest)this._Request).AllowAutoRedirect = false;
            }

            return this._Request;
        } 

        public HttpStatusCode StatusCode()
        {
            HttpStatusCode result;

            if (this._Request == null)
            {
                throw (new InvalidOperationException("Unable to retrieve the status 
                       code, maybe you haven't made a request yet."));
            }

            HttpWebResponse response = base.GetWebResponse(this._Request) 
                                       as HttpWebResponse;

            if (response != null)
            {
                result = response.StatusCode;
            }
            else
            {
                throw (new InvalidOperationException("Unable to retrieve the status 
                       code, maybe you haven't made a request yet."));
            }

            return result;
        }
    }

আপনি যদি নেট .৪.৫. এক্স বা আরও নতুন ব্যবহার করে থাকেন তবে এইচটিটিপি ক্লায়েন্টে স্যুইচ করুন :

var response = await client.GetAsync("http://www.contoso.com/");
var statusCode = response.StatusCode;

উইন্ডোজ ফোনে কাজ করে না - getWebResponse () কেবলমাত্র দ্বি-প্যারামিটার স্বাদে বিদ্যমান। এখনও +1।
সেবা আলেকসেয়েভ

আকর্ষণীয় যে এটি কাজ করে না। আপনার উত্তরটি কৌতুক করে খুশি!
এরিক ফিলিপস

আমার জন্য কাজ করেছেন, যেখানে উচ্চতর উত্তরের প্রতিচ্ছবিটি হয়নি (নেট নেট 4.5 উইন্ডোজ 7 এবং 10 অ্যাপ্লিকেশন)
ডেভিড শিল্ডস

9

এরিকের উত্তর উইন্ডোজ ফোনে যেমন কাজ করে না তেমন। নিম্নলিখিতগুলি করে:

class WebClientEx : WebClient
{
    private WebResponse m_Resp = null;

    protected override WebResponse GetWebResponse(WebRequest Req, IAsyncResult ar)
    {
        try
        {
            this.m_Resp = base.GetWebResponse(request);
        }
        catch (WebException ex)
        {
            if (this.m_Resp == null)
                this.m_Resp = ex.Response;
        }
        return this.m_Resp;
    }

    public HttpStatusCode StatusCode
    {
        get
        {
            if (m_Resp != null && m_Resp is HttpWebResponse)
                return (m_Resp as HttpWebResponse).StatusCode;
            else
                return HttpStatusCode.OK;
        }
    }
}

কমপক্ষে এটি ব্যবহার করার সময় করে OpenReadAsync; অন্যান্য জন্যxxxAsync পদ্ধতির জন্য, সাবধানতার সাথে পরীক্ষা করার পরামর্শ দেওয়া হবে। ফ্রেমওয়ার্কটি কোড পাথের সাথে কোথাও গেটওয়েব্রেসপনসকে কল করে; প্রত্যেকে যা করতে হবে তা হল প্রতিক্রিয়া অবজেক্টটি ক্যাপচার এবং ক্যাশে করা।

এই স্নিপেটে ফ্যালব্যাক কোডটি 200 কারণ প্রকৃত এইচটিটিপি ত্রুটি - 500, 404, ইত্যাদি - যাইহোক ব্যতিক্রম হিসাবে প্রতিবেদন করা হয়েছে। এই কৌশলটির উদ্দেশ্যটি হ'ল আমার নির্দিষ্ট ক্ষেত্রে 304 (সংশোধিত নয়) নন-ত্রুটিযুক্ত কোডগুলি ক্যাপচার করা। সুতরাং ফ্যালব্যাক ধরে নিয়েছে যে যদি স্থিতি কোডটি কোনওভাবে অনুপলব্ধ হয় তবে কমপক্ষে এটি একটি অ-ভুল।


3

আপনার ব্যবহার করা উচিত

if (e.Status == WebExceptionStatus.ProtocolError)
{
   HttpWebResponse response = (HttpWebResponse)ex.Response;             
   if (response.StatusCode == HttpStatusCode.NotFound)
      System.Diagnostics.Debug.WriteLine("Not found!");
}

4
এই কেন ভোট দেওয়া হয়েছিল? ওপি স্পষ্টভাবে বলেছে: However if the form is submitted successfully and no exception is thrown...
কেনেথ কে।

2

ওয়েব-ক্লায়েন্ট কার্যকারিতা বাড়ানোর জন্য এটিই আমি ব্যবহার করি। স্থিতি কোড এবং স্থিতি বর্ণনায় সর্বদা সাম্প্রতিক প্রতিক্রিয়া কোড / বিবরণ থাকবে।

                /// <summary>
                /// An expanded web client that allows certificate auth and 
                /// the retrieval of status' for successful requests
                /// </summary>
                public class WebClientCert : WebClient
                {
                    private X509Certificate2 _cert;
                    public WebClientCert(X509Certificate2 cert) : base() { _cert = cert; }
                    protected override WebRequest GetWebRequest(Uri address)
                    {
                        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
                        if (_cert != null) { request.ClientCertificates.Add(_cert); }
                        return request;
                    }
                    protected override WebResponse GetWebResponse(WebRequest request)
                    {
                        WebResponse response = null;
                        response = base.GetWebResponse(request);
                        HttpWebResponse baseResponse = response as HttpWebResponse;
                        StatusCode = baseResponse.StatusCode;
                        StatusDescription = baseResponse.StatusDescription;
                        return response;
                    }
                    /// <summary>
                    /// The most recent response statusCode
                    /// </summary>
                    public HttpStatusCode StatusCode { get; set; }
                    /// <summary>
                    /// The most recent response statusDescription
                    /// </summary>
                    public string StatusDescription { get; set; }
                }

সুতরাং আপনি একটি পোস্ট করতে পারেন এবং এর মাধ্যমে ফলাফল পেতে পারেন:

            byte[] response = null;
            using (WebClientCert client = new WebClientCert())
            {
                response = client.UploadValues(postUri, PostFields);
                HttpStatusCode code = client.StatusCode;
                string description = client.StatusDescription;
                //Use this information
            }

আমি প্রতিক্রিয়া কোডটি খুঁজছিলাম বলে এটি আমার পক্ষে দুর্দান্ত কাজ করেছে। চমৎকার সমাধান!
অশুভ ফিশ

সচেতন থাকুন [HTTPClient এর বিপরীতে] 4XX এবং 5xx প্রতিক্রিয়াগুলির ফলে একটি "ওয়েবডেস্কিপশন" "রেসপন্স = বেস। গেটওয়েবরেস্পোনস (অনুরোধ)" এ নিক্ষেপ করা হবে; " লাইন আপনি ব্যতিক্রম থেকে স্থিতি এবং প্রতিক্রিয়াটি টানতে পারেন (যদি তাদের উপস্থিত থাকে)।
mordm

হ্যাঁ. আপনার এখনও সাধারণের মতো ব্যতিক্রমগুলি ধরতে হবে। তবে, যদি এর ব্যতিক্রম না হয়, এটি ওপি কী চেয়েছিল তা প্রকাশ করে।
ডিএফটিআর

1

কেবলমাত্র যদি অন্য কারোর উপরে বর্ণিত হ্যাকের একটি এফ # সংস্করণ প্রয়োজন।

open System
open System.IO
open System.Net

type WebClientEx() =
     inherit WebClient ()
     [<DefaultValue>] val mutable m_Resp : WebResponse

     override x.GetWebResponse (req: WebRequest ) =
        x.m_Resp <- base.GetWebResponse(req)
        (req :?> HttpWebRequest).AllowAutoRedirect <- false;
        x.m_Resp

     override x.GetWebResponse (req: WebRequest , ar: IAsyncResult  ) =
        x.m_Resp <- base.GetWebResponse(req, ar)
        (req :?> HttpWebRequest).AllowAutoRedirect <- false;
        x.m_Resp

     member x.StatusCode with get() : HttpStatusCode = 
            if not (obj.ReferenceEquals (x.m_Resp, null)) && x.m_Resp.GetType() = typeof<HttpWebResponse> then
                (x.m_Resp :?> HttpWebResponse).StatusCode
            else
                HttpStatusCode.OK

let wc = new WebClientEx()
let st = wc.OpenRead("http://www.stackoverflow.com")
let sr = new StreamReader(st)
let res = sr.ReadToEnd()
wc.StatusCode
sr.Close()
st.Close()

-1

আপনার "ক্লায়েন্ট। রেসপন্সহেইডার্স [..]" কলটি ব্যবহার করতে সক্ষম হওয়া উচিত , প্রতিক্রিয়া থেকে জিনিস ফিরে পাওয়ার উদাহরণগুলির জন্য এই লিঙ্কটি দেখুন


4
প্রতিক্রিয়া শিরোনামগুলি হ'ল সার্ভারের শিরোনামগুলি যেমন সার্ভার, তারিখ, প্রাগমা ইত্যাদি, কিন্তু কোন স্থিতি কোড (200,301,404 ...)
Julio

4
এটি সম্পর্কে দুঃখিত, এটি ফিরে না পেয়ে কিছুটা অবাক হয়েছিল।
পল হ্যাডফিল্ড

-1

আপনি ওয়েবএক্সসেপশন থেকে বা ওপেনআরডকম্পল্টেড এভেন্টআর্গস.এরর থেকে এইচটিটিপি স্থিতি কোড পেতে এই কোডটি চেষ্টা করতে পারেন। এটি সিলভারলাইটেও কাজ করে কারণ এসএলে ওয়েবএক্সেপশনস্ট্যাটাস নেই rot

HttpStatusCode GetHttpStatusCode(System.Exception err)
{
    if (err is WebException)
    {
        WebException we = (WebException)err;
        if (we.Response is HttpWebResponse)
        {
            HttpWebResponse response = (HttpWebResponse)we.Response;
            return response.StatusCode;
        }
    }
    return 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.