Tôi đang viết một ứng dụng POC sử dụng Microsoft.ServiceBus.dll 1.0.0.0 (phiên bản .NET 3.5).Tự động gán kiểu nội dung phản hồi json trong WCF Azure Service Bus
Hợp đồng của tôi WCF và dịch vụ trông giống như sau:
[ServiceContract(Name="MyServiceContract", Namespace = "http://mydomain.com/")]
internal interface IServiceContract
{
[WebInvoke(Method = "POST", UriTemplate = "/DoOperation")]
[OperationContract]
Stream RelayRequest(Stream requestBody);
}
[ServiceBehavior(Name = "Service1", Namespace = "http://mydomain.com/Service1/", InstanceContextMode = InstanceContextMode.Single)]
internal class Service1 : IServiceContract
{
Stream RelayRequest(Stream requestBody)
{
var contents = GetJsonResponse();
var responseStream = new MemoryStream();
var streamWriter = new StreamWriter(responseStream);
streamWriter.AutoFlush = true;
var writer = new JsonTextWriter(streamWriter);
var serializer = new JsonSerializer();
serializer.Serialize(responseStream, contents);
responseStream.Position = 0 // reset the position of the stream so that it's contents will be read from the beginning.
//Problem Line:
WebOperationContext.OutgoingResponse.ContentType = "application/json";
return responseStream;
}
}
Điểm cuối nghe được cấu hình để sử dụng WebHttpRelayBinding:
- SecurityMode: Giao thông vận tải
- TransferMode: Đã phát
Khi tôi cố gắng chỉ định ContentType của phản hồi gửi đến "application/json" một lỗi không xảy ra nhưng yêu cầu gọi trở lại với mã trạng thái 504 (Thời gian chờ cổng).
Nếu tôi thay đổi ContentType thành "text/javascript", yêu cầu gọi trở lại với 200 (OK).
Một số điều cần lưu ý:
- Các content-type không biết cho đến khi thời gian chạy vì vậy nó phải được gán tự động.
- Nội dung của luồng là tinh khiết - 100% hợp lệ - json.
- Mục đích chấp nhận và trả lại luồng là để chúng tôi có thể chấp nhận yêu cầu phát trực tiếp và dữ liệu luồng xuống cho khách hàng.
- Mỗi yêu cầu/phản hồi có thể chứa tải trọng json nhỏ hoặc tài liệu 200MB.
- Nếu bạn muốn repro - mã này sử dụng thư viện Newtonson Json để tuần tự hóa.
Tại sao điều này xảy ra và làm cách nào để khắc phục sự cố này?
CHỈNH SỬA: Mã trạng thái 504 có thể là một đoạn trích màu đỏ được suy ra bởi người chơi số mà tôi đang thử nghiệm. Gửi yêu cầu tương tự từ System.Net.Http.HttpClient cho biết kết nối đã bị đóng trước khi nhận được phản hồi.
CHỈNH SỬA: đặt loại nội dung thành nhiều thứ khác (bao gồm giá trị không nhạy cảm) hoạt động tốt. Loại nội dung duy nhất mà tôi có thể phá vỡ là ứng dụng/json
Bạn có thể thêm thông tin từ tệp cấu hình của mình/cách bạn thiết lập dịch vụ không? Bạn đang sử dụng loại ràng buộc nào? – TheDude
Như đã chỉ ra ở trên, chúng tôi sử dụng WebHttpRelayBinding. Điểm kết buộc/kết thúc này không được tạo bởi cấu hình, nó được tạo lập trình khi chạy. –
À, tôi đoán là tôi đã có một loạt các mất trí nhớ đọc mô tả của bạn ... – TheDude