รับหมายเลขรหัสสถานะ Http (200, 301, 404, ฯลฯ ) จาก HttpWebRequest และ HttpWebResponse


289

ฉันพยายามที่จะได้รับหมายเลขรหัสสถานะ HTTP จากวัตถุกลับมาจากHttpWebResponse HttpWebRequestฉันหวังว่าจะได้ตัวเลขจริง (200, 301,302, 404 และอื่น ๆ ) แทนที่จะเป็นคำอธิบายข้อความ ("ตกลง", "MovedPermanently" ฯลฯ ) หมายเลขนั้นถูกฝังอยู่ในสถานที่หนึ่งในวัตถุตอบสนองหรือไม่? มีความคิดอื่นนอกเหนือจากการสร้างฟังก์ชั่นสวิตช์ขนาดใหญ่หรือไม่ ขอบคุณ

HttpWebRequest webRequest = (HttpWebRequest)WebRequest
                                           .Create("http://www.gooogle.com/");
webRequest.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
//Returns "MovedPermanently", not 301 which is what I want.
Console.Write(response.StatusCode.ToString());

สำหรับการกระทำที่ตรงข้าม: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

คำตอบ:


402
Console.Write((int)response.StatusCode);

HttpStatusCode (ชนิดของresponse.StatusCode) คือการแจงนับที่ค่าของสมาชิกตรงกับรหัสสถานะ HTTP เช่น

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}

1
แต่ในกรณีของข้อยกเว้น "connectfailure" ของ webexception ฉันได้รับการตอบสนองเป็นโมฆะในกรณีนั้นฉันจะรับรหัส httpstatus ได้อย่างไร
Rusty

10
@rusty: หากการเชื่อมต่อล้มเหลวและไม่สามารถส่งคำขอและไม่สามารถรับการตอบกลับได้จะไม่มีรหัสสถานะ http
โอลิเวอร์

3
รับค่าHTTP Substatusอย่างไร ตัวอย่างเช่น404.13 ความยาวเนื้อหามีขนาดใหญ่เกินไปการอ้างอิง: iis.net/configreference/system.webserver/security/…
Kiquenet

9
โบนัส:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain

12
@ Alain โบนัสสองเท่า บูลสำเร็จ = response.IsSuccessStatusCode;
htxryan

244

คุณต้องระวังการตอบกลับของเซิร์ฟเวอร์ในช่วง 4xx และ 5xx เป็นการโยน WebException คุณต้องจับมันแล้วรับรหัสสถานะจากวัตถุ WebException:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}

ฉันดีใจที่คุณพูดถึง 4xx และ 5xx เพราะฉันมีปัญหากับโปรแกรมที่ทำงานไม่ถูกต้อง ฉันควรชี้ให้เห็นว่ากรอบงาน. NET ปัจจุบันจะแจ้งให้คุณทราบถึงข้อยกเว้นที่ไม่ถูกตรวจจับใด ๆ ดังนั้นนี่จึงไม่ใช่เรื่องง่าย
Joel Trauger

ในฐานะโบนัสผู้ใช้สามารถตกแต่งวิธีด้วย [DebuggerNonUserCode] และตัวดีบักจะไม่หยุดในวิธีนั้นเมื่อมีข้อยกเว้นเกิดขึ้น ในลักษณะนี้ข้อยกเว้นที่ออกแบบมาไม่ดีอาจถูกห่อและละเว้น แต่ตอนนี้จำเป็นต้องมีการตั้งค่ารีจิสทรี
crokusek

21

ตาม 'dtb' คุณต้องใช้ HttpStatusCode แต่การติดตาม 'zeldi' คุณจะต้องระมัดระวังเป็นพิเศษกับการตอบสนองโค้ด> = 400

สิ่งนี้ได้ผลสำหรับฉัน:

HttpWebResponse response = null;
HttpStatusCode statusCode;
try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException we)
{
    response = (HttpWebResponse)we.Response;
}

statusCode = response.StatusCode;
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
sResponse = reader.ReadToEnd();
Console.WriteLine(sResponse);
Console.WriteLine("Response Code: " + (int)statusCode + " - " + statusCode.ToString());

HttpWebResponse ใช้ IDisposable เพื่อจัดการกับสิ่งนั้น คุณสามารถใช้สิ่งต่อไปนี้แทนซึ่งอนุญาตให้คุณประกาศ "การตอบสนอง" ภายในบล็อกที่ใช้: สาธารณะ HttpWebResponse GetSafeResponse (คำขอ HttpWebRequest) {ลอง {return (HttpWebResponse) คำขอ GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

เพียงแค่บีบบังคับไปStatusCodeint

var statusNumber;
try {
   response = (HttpWebResponse)request.GetResponse();
   // This will have statii from 200 to 30x
   statusNumber = (int)response.StatusCode;
}
catch (WebException we) {
    // Statii 400 to 50x will be here
    statusNumber = (int)we.Response.StatusCode;
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.