มีวิธีง่ายๆในการรับรหัสสถานะ HTTP จากSystem.Net.WebException
หรือไม่
มีวิธีง่ายๆในการรับรหัสสถานะ HTTP จากSystem.Net.WebException
หรือไม่
คำตอบ:
อาจจะเป็นสิ่งนี้ ...
try
{
// ...
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
var response = ex.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
}
else
{
// no http status code available
}
}
else
{
// no http status code available
}
}
โดยใช้ตัวดำเนินการnull เงื่อนไข ( ?.
) คุณจะได้รับรหัสสถานะ HTTP ด้วยรหัสบรรทัดเดียว:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
ตัวแปรจะมีstatus
HttpStatusCode
เมื่อมีความล้มเหลวทั่วไปมากขึ้นเช่นข้อผิดพลาดเครือข่ายที่ไม่มีรหัสสถานะ HTTP ที่เคยส่งมาแล้วstatus
จะเป็นโมฆะ ในกรณีที่คุณสามารถตรวจสอบที่จะได้รับex.Status
WebExceptionStatus
หากคุณต้องการให้สตริงคำอธิบายเพื่อเข้าสู่ระบบในกรณีที่เกิดความล้มเหลวคุณสามารถใช้ตัวดำเนินการnull-coalescing ( ??
) เพื่อรับข้อผิดพลาดที่เกี่ยวข้อง:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
หากมีการโยนข้อยกเว้นอันเป็นผลมาจากรหัสสถานะ 404 HTTP สตริงจะมี "NotFound" ในทางตรงกันข้ามถ้าเซิร์ฟเวอร์ออฟไลน์สตริงจะมี "ConnectFailure" และอื่น ๆ
(และสำหรับใครก็ตามที่ต้องการทราบวิธีรับรหัสย่อย HTTP นั้นเป็นไปไม่ได้มันเป็นแนวคิดของ Microsoft IIS ที่จะเข้าสู่ระบบบนเซิร์ฟเวอร์เท่านั้นและไม่เคยส่งไปยังไคลเอนต์)
?.
ดำเนินการเดิมชื่อตัวดำเนินการการเผยแพร่ว่างหรือตัวดำเนินการ null ตามเงื่อนไขในระหว่างการเปิดตัวตัวอย่าง แต่ผู้ตรวจสอบ Atlassian ให้คำเตือนให้ใช้โอเปอเรเตอร์การขยายสัญญาณว่างในสถานการณ์ดังกล่าว ยินดีที่ได้ทราบว่ามันจะเรียกว่าตัวดำเนินการ null เงื่อนไข
สิ่งนี้จะทำงานได้ก็ต่อเมื่อ WebResponse เป็น HttpWebResponse
try
{
...
}
catch (System.Net.WebException exc)
{
var webResponse = exc.Response as System.Net.HttpWebResponse;
if (webResponse != null &&
webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
MessageBox.Show("401");
}
else
throw;
}
(ฉันรู้ว่าคำถามนั้นเก่า แต่เป็นหนึ่งในเพลงยอดนิยมใน Google)
สถานการณ์ทั่วไปที่คุณต้องการทราบรหัสการตอบสนองอยู่ในการจัดการข้อยกเว้น ตั้งแต่ C # 7 คุณสามารถใช้การจับคู่รูปแบบเพื่อป้อนคำสั่ง catch เท่านั้นหากข้อยกเว้นตรงกับเพรดิเคตของคุณ:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
สิ่งนี้สามารถขยายไปสู่อีกระดับได้อย่างง่ายดายเช่นในกรณีนี้ที่WebException
จริง ๆ แล้วเป็นข้อยกเว้นภายในของอีกอันหนึ่ง (และเราสนใจเฉพาะ404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
ในที่สุด: โปรดทราบว่าไม่จำเป็นต้องโยนข้อยกเว้นอีกครั้งในประโยคจับเมื่อไม่ตรงกับเกณฑ์ของคุณเนื่องจากเราไม่ได้ป้อนข้อในสถานที่แรกด้วยการแก้ปัญหาข้างต้น
คุณสามารถลองใช้รหัสนี้เพื่อรับรหัสสถานะ HTTP จาก WebException มันทำงานใน Silverlight เช่นกันเพราะ SL ไม่ได้กำหนด WebExceptionStatus.ProtocolError
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? หรือดีกว่าHttpStatusCode?
(เป็นโมฆะ )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
ฉันไม่แน่ใจว่ามี แต่ถ้ามีคุณสมบัติดังกล่าวจะไม่ถือว่าเชื่อถือได้ A WebException
สามารถเริ่มทำงานได้ด้วยเหตุผลอื่นนอกเหนือจากรหัสข้อผิดพลาด HTTP รวมถึงข้อผิดพลาดของเครือข่ายอย่างง่าย สิ่งเหล่านั้นไม่มีรหัสข้อผิดพลาด http ที่ตรงกันเช่นนั้น
คุณช่วยให้ข้อมูลเพิ่มเติมกับเราเกี่ยวกับสิ่งที่คุณพยายามทำให้สำเร็จด้วยรหัสนั้นได้หรือไม่ อาจมีวิธีที่ดีกว่าในการรับข้อมูลที่คุณต้องการ