8

Tôi hiện đang di chuyển dịch vụ RESTF WCF của tôi từ .NET 3.5 (Starter Kit) sang .NET 4. Tôi bắt đầu dự án của mình bằng cách sử dụng mẫu dịch vụ WCF Rest from Visual Studio 2010. Tôi phải tìm ra cách giữ lược đồ ủy quyền của tôi (được thực hiện một cách chính xác với RequestInterceptor) bằng ServiceAuthorizationManager. Sau khi một số công việc và nghiên cứu tôi đã hoàn thành nó. Nhưng bây giờ tôi có vấn đề về tài sản thế chấp. Dịch vụ của tôi được sử dụng để phản hồi khách hàng của tôi về bất kỳ lỗi xử lý nào bằng cách sử dụng mã trạng thái HTTP và mô tả ngắn gọn. Tôi đã sử dụng WebOperationContext tại nhiều điểm của phương pháp dịch vụ của tôi để mô tả cho các khách hàng những gì đã xảy ra, như thế này:WCF 4 dịch vụ REST không thể trả về một StatusDescription, chỉ có StatusCode

protected void returnCode(HttpStatusCode code, string description) 
{ 
    WebOperationContext ctx = WebOperationContext.Current; 
    ctx.OutgoingResponse.StatusDescription = description; 
    ctx.OutgoingResponse.StatusCode = code; 
} 

Nhưng trong WCF 4, chỉ StatusCode hoạt động - StatusDescription âm thầm thất bại. Tôi không thể hiểu tại sao. Đoán duy nhất của tôi là WebOperationContext không hoạt động trong kịch bản WCF 4 mới này, và tôi nên sử dụng OperationContext thay vào đó, nhưng điều đó cũng không hoạt động. Các phương pháp sau đây được sử dụng trong lớp tùy chỉnh của tôi mở rộng ServiceAuthorizationManager, thông báo cho khách hàng một yêu cầu không thể được truy cập bởi vì auth tiêu hóa đã bị thay đổi:

private void GenerateBadDigestMessage(ref OperationContext operationContext) 
{ 
    Message reply = Message.CreateMessage(MessageVersion.None, null, null, new DataContractJsonSerializer(typeof(object))); 

    HttpResponseMessageProperty hrp = new HttpResponseMessageProperty(); 
    hrp.StatusCode = HttpStatusCode.Forbidden; 
    hrp.StatusDescription = "bad digest"; 
    reply.Properties[HttpResponseMessageProperty.Name] = hrp; 

    operationContext.RequestContext.Reply(reply); 
    operationContext.RequestContext = null; 
} 

Thậm chí bằng cách sử dụng OperationContext direclty đây (insted của WebOperationContext), StatusDescription không công việc.

Tôi thiếu gì ở đây? Tại sao một điều nhỏ như vậy có thể phá vỡ từ .NET 3.5 đến 4?

+0

Tự lưu trữ hoặc IIS? Phiên bản máy chủ nào? Tôi đã thử nghiệm này trên 4.0 với Server 2008R2 tự lưu trữ, và nó hoạt động tốt (trả về mô tả trạng thái như thiết lập). – nitzmahone

+0

Bạn đã bao giờ tìm được giải pháp chưa? Tôi đang đối mặt với vấn đề tương tự. – Hemant

Trả lời

4

Tôi khuyên bạn nên sử dụng WebFaultException trong .NET 4.0. Đọc ví dụ "Introducing WCF WebHttp Services in .NET 4". Hãy thử

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden); 
+0

Xin lỗi nhưng việc sử dụng .NET 4.0 không phải là một tùy chọn. Bất kỳ may mắn với .NET 3.5? – Hemant

+0

@Hemant: Xin lỗi vì sự hiểu lầm, nhưng bạn bắt đầu câu hỏi của bạn với từ đó, rằng bạn đang di chuyển dịch vụ của bạn từ .NET 3.5 (Starter Kit) sang .NET 4 và bạn có một số vấn đề.Vì vậy, tôi hiểu bạn như vậy, rằng bạn đã làm việc giải pháp trong .NET 3.5 và bạn muốn có nó làm việc trong .NET 4.0. Tôi đã từng gặp vấn đề tương tự. Trong .NET 3.5 tôi đã sử dụng 'WebProtocolException' để báo cáo lỗi. Sau khi di chuyển sang .NET 4.0, tôi quyết định không sử dụng ** WCF REST Starter Kit. .NET 4.0 có tất cả các tính năng cần thiết để phát triển WCF REST. Thay vì 'WebProtocolException' tôi sử dụng' WebFaultException'. – Oleg

+0

Cảm ơn bạn đã trả lời. Ban đầu tôi không hỏi câu hỏi này. Tôi đã chỉ đấu tranh với cùng một vấn đề và thấy rằng câu hỏi đã hỏi ở trên không có câu trả lời, đặt một tiền thưởng vào nó. – Hemant

1

Một vấn đề tiềm năng là bạn đang thiết lập các RequestContext để null:

operationContext.RequestContext.Reply(reply);  
operationContext.RequestContext = null; 

khả năng khác là tham số "mô tả" không được thiết lập.

Ngoài ra trên các mặt hàng được bạn kiểm tra:

WebOperationContext.Current.IncomingResponse.StatusDescription 

Thêm một khả năng, có thể các giá trị đã được ghi đè sau khi mã trả được gọi là?

2

OK! Đây là những gì tôi phát hiện ra. Không có gì sai với mã của tôi. Không có gì sai với .NET framework 3.5 hoặc 4.0.

Vấn đề là máy chủ phát triển asp.net. Khi bạn đang gỡ lỗi ứng dụng dịch vụ của bạn, nó có khả năng được lưu trữ trên máy chủ phát triển asp.net và nó hoàn toàn bỏ qua các mô tả trạng thái được đưa ra bởi ứng dụng. Refer this question.

Tặng tiền thưởng cho @Oleg người ít nhất đã cố gắng giúp tôi.

+0

Ngẫu nhiên, đây cũng là lý do tại sao nó không hoạt động trong Web Api. Tôi tìm thấy câu trả lời của bạn và ngay sau khi tôi chạy mã của tôi dưới IIS, các ReasonPhrase thay đổi mô tả trạng thái. –

1

Đảm bảo bạn quay trở lại từ đối tượng NULL của phương thức dịch vụ ... để mô tả mã trạng thái hiển thị trong Tiêu đề phản hồi, nó hoạt động cho tôi.

Các vấn đề liên quan