ฉันจะส่งคืนรหัสสถานะ HTTP ที่กำหนดเองจากวิธี WCF REST ได้อย่างไร


88

หากมีสิ่งผิดปกติเกิดขึ้นในการเรียก WCF REST เช่นไม่พบทรัพยากรที่ร้องขอฉันจะเล่นกับรหัสตอบกลับ HTTP ได้อย่างไร (ตั้งค่าเป็น HTTP 404 เป็นต้น) ในเมธอด OperationContract ของฉัน


ตกลงคำตอบทั้งหมดสำหรับการควบคุมนี้ถือว่าเป็นการใช้บริการของคุณ จะเกิดอะไรขึ้นถ้าพวกเขาผ่าน uri ที่ไม่ถูกต้องทั้งหมด? คุณคิดว่าจะให้ 404 สำหรับความนิยมที่ไม่คาดคิดทั้งหมดในบริการของคุณอย่างไร
Nathan Tregillus

คำตอบ:


112

มีWebOperationContextที่คุณสามารถเข้าถึงและมีOutgoingResponseคุณสมบัติประเภทOutgoingWebResponseContextที่มีStatusCodeคุณสมบัติที่สามารถตั้งค่าได้

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;

5
สิ่งนี้ทำงานใน WCF Data Services - Service Operations หรือไม่ ฉันไม่ได้โชคดีดูเหมือนว่า StatusCode ที่ฉันตั้งไว้จะได้รับความสนใจจากอย่างอื่น ดังนั้นในคำขอ HTTP POST ทั้งหมดฉันจะได้รับ 204 คืนไม่ว่าฉันจะตั้งค่าไว้ที่ 201 เป็นต้น
RyBolt

1
ไม่ได้ผลในกรณีของฉันสถานะจะถูกเขียนทับ WebFaultExceptionอย่างไรก็ตามการขว้างปาดูเหมือนจะได้ผล
Josh M.

74

หากคุณต้องการส่งคืนส่วนเหตุผลให้ดูที่WebFaultException

ตัวอย่างเช่น

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );

4
ฉันชอบสิ่งนี้ดีกว่าสิ่งที่ยอมรับเนื่องจากเราไม่ได้ใช้ WebOperationContext แบบคงที่ปัจจุบัน
Noel Abrahams

โปรดทราบว่านี่ใช้ได้เฉพาะเมื่อ famework 4 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

1
อืมใน. NET 4.5.1 นี่ไม่ได้ตั้งค่ารหัสสถานะสำหรับฉันฉันยังคงได้รับ 200 ฉันใช้ jsonp มันโทรกลับของฉัน (ในจาวาสคริปต์) และส่งข้อความและรหัสสถานะของฉันเป็น จำนวนเต็ม.
Shavais

4
ดูเหมือนว่าจะดีสำหรับอะไรก็ตามที่อยู่นอกรหัส 2XX แต่คุณWebFaultExceptionจะส่งคืนHttpStatusCode.Createdหรือไม่?
ขยี้

23

สำหรับ 404 มีเมธอดในตัวบนWebOperationContext.Current.OutgoingResponse ที่เรียกว่าSetStatusAsNotFound (ข้อความสตริง)ที่จะตั้งรหัสสถานะเป็น 404 และคำอธิบายสถานะด้วยการเรียกเพียงครั้งเดียว

โปรดทราบว่ายังมีSetStatusAsCreated (ตำแหน่ง Uri)ที่จะตั้งรหัสสถานะเป็น 201 และส่วนหัวตำแหน่งด้วยการเรียกเพียงครั้งเดียว


เป็นที่ต้องการมากกว่าวิธีการที่แสดงในคำตอบที่ยอมรับหรือไม่?
ขยี้

2

หากคุณต้องการดูคำอธิบายสถานะในส่วนหัวเมธอด REST ควรตรวจสอบให้แน่ใจว่าได้คืนค่า null จากส่วน Catch () ดังต่อไปนี้:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
สิ่งนี้ใช้ไม่ได้ผลสำหรับฉันฉันยังคงได้รับ 200 ฉันใช้ WebHttpBinding กับ crossDomainScriptAccessEnabled = "true" และพฤติกรรมจุดสิ้นสุดของ webHttp ที่มีรูปแบบเนื้อหาเริ่มต้นของการรวมและรูปแบบการตอบกลับขาออกเริ่มต้นของ json .. แต่มันไม่สำคัญควรหรือไม่?
Shavais

2

นอกจากนี้คุณยังสามารถกลับ statuscode และเหตุผลในร่างกายด้วยWebOperationContext 's StatusCodeและStatusDescription :

WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";


0

สิ่งนี้ไม่ได้ผลสำหรับฉันสำหรับ WCF Data Services แต่คุณสามารถใช้ DataServiceException ในกรณีของบริการข้อมูล พบว่าโพสต์ต่อไปนี้มีประโยชน์ http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de


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