Làm cách nào để trả về mã trạng thái HTTP tùy chỉnh từ phương thức WCF REST?


88

Nếu xảy ra sự cố trong lệnh gọi WCF REST, chẳng hạn như không tìm thấy tài nguyên được yêu cầu, thì làm cách nào để tôi có thể xử lý với mã phản hồi HTTP (ví dụ: đặt nó thành một thứ gì đó như HTTP 404) trong phương thức OperationContract của tôi?


ok tất cả các câu trả lời cho điều khiển giả định này đã được đưa vào triển khai dịch vụ của bạn. điều gì sẽ xảy ra nếu họ vượt qua một số tiểu hoàn toàn không hợp lệ? làm thế nào bạn giả sử cung cấp một 404 cho tất cả các lần truy cập không mong muốn cho dịch vụ của bạn?
Nathan Tregillus,

Câu trả lời:


111

Có một thuộc tính WebOperationContextmà bạn có thể truy cập và nó có một OutgoingResponsethuộc tính loại OutgoingWebResponseContextcó một thuộc StatusCodetính có thể được thiết lập.

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

5
Điều này có hoạt động bên trong Dịch vụ dữ liệu WCF - Hoạt động dịch vụ không? Tôi không gặp may, có vẻ như Mã trạng thái tôi đặt bị thứ khác lấn át. Vì vậy, trên tất cả các yêu cầu HTTP POST, tôi nhận lại 204 bất kể tôi đặt nó ở mức 201, v.v.
RyBolt

1
Không hoạt động trong trường hợp của tôi, trạng thái bị ghi đè. WebFaultExceptionTuy nhiên, ném a có vẻ hiệu quả.
Josh M.

73

Nếu bạn cần trả về một lý do thì hãy xem WebFaultException

Ví dụ

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

4
Tôi như điều này hơn ai chấp nhận vì chúng ta đang không sử dụng WebOperationContext.Current tĩnh
Noel Abrahams

hãy nhớ rằng điều này chỉ hợp lệ vì danh sách 4 msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

hmm, trong .NET 4.5.1, điều này không đặt mã trạng thái cho tôi, tôi vẫn nhận được 200. Tôi đang sử dụng jsonp, nó đang gọi lại cuộc gọi lại của tôi (trong javascript) và chuyển tin nhắn và mã trạng thái của tôi dưới dạng số nguyên.
Shavais

4
Điều này có vẻ tuyệt vời đối với bất kỳ thứ gì ngoài mã 2XX, nhưng bạn có ném WebFaultExceptionđể trả về một HttpStatusCode.Createdkhông?
nghiền nát

23

Đối với 404, có một phương thức tích hợp trên WebOperationContext.Current.OutgoingResponse được gọi là SetStatusAsNotFound (thông báo chuỗi) sẽ đặt mã trạng thái thành 404 và mô tả trạng thái bằng một lệnh gọi.

Cũng lưu ý rằng, SetStatusAsCreate (Vị trí Uri) sẽ đặt mã trạng thái thành 201 và tiêu đề vị trí bằng một lệnh gọi.


Phương pháp này có được ưu tiên hơn phương pháp hiển thị trong câu trả lời được chấp nhận không?
nghiền nát

2

Nếu bạn muốn xem mô tả trạng thái trong tiêu đề, phương thức REST phải đảm bảo trả về null từ phần Catch () như bên dưới:

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

1
Điều này cũng không hiệu quả với tôi, tôi vẫn nhận được 200. Tôi đang sử dụng WebHttpBinding với crossDomainScriptAccessEnabled = "true" và một hành vi điểm cuối của webHttp với kiểu nội dung mặc định là được bao bọc và định dạng phản hồi gửi đi mặc định của json .. nhưng điều đó không quan trọng, phải không?
Shavais

2

Bạn cũng có thể trả về một cơ thể statusCode và lý trí với WebOperationContext 's StatusCodeStatusDescription :

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


0

Điều này không hoạt động đối với tôi đối với Dịch vụ Dữ liệu WCF. Thay vào đó, bạn có thể sử dụng DataServiceException trong trường hợp Dịch vụ dữ liệu. Thấy bài viết sau hữu ích. http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de


Điều đó cũng không hiệu quả với tôi, tôi chỉ nhận được 400 Yêu cầu không hợp lệ, không có thông tin hữu ích nào khác và không có cơ quan phản hồi.
Shavais
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.