Có đúng là trong WCF, tôi không thể có dịch vụ viết cho luồng mà khách hàng nhận được không?WCF và các yêu cầu và phản hồi trực tuyến
Phát trực tuyến được hỗ trợ trong WCF cho các yêu cầu, phản hồi hoặc cả hai. Tôi muốn hỗ trợ một kịch bản mà bộ tạo dữ liệu (hoặc máy khách trong trường hợp yêu cầu được truyền trực tuyến hoặc máy chủ trong trường hợp phản hồi được truyền trực tiếp) có thể ghi trên luồng. Điều này có được hỗ trợ không?
Tương tự là Response.OutputStream từ một yêu cầu ASP.NET. Trong ASPNET, bất kỳ trang nào cũng có thể gọi Write trên luồng đầu ra và nội dung được khách hàng nhận. Tôi có thể làm một cái gì đó tương tự trong một dịch vụ WCF - gọi Viết trên một luồng mà khách hàng nhận được không?
Hãy để tôi giải thích bằng hình minh họa WCF. Ví dụ đơn giản nhất về Streaming trong WCF là dịch vụ trả về một FileStream cho một máy khách. Đây là phản hồi được truyền trực tiếp. Mã máy chủ để thực hiện điều này, là như thế này:
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream GetData(string fileName);
}
public class StreamService : IStreamService
{
public Stream GetData(string filename)
{
return new FileStream(filename, FileMode.Open)
}
}
Và mã khách hàng là như thế này:
StreamDemo.StreamServiceClient client =
new WcfStreamDemoClient.StreamDemo.StreamServiceClient();
Stream str = client.GetData(@"c:\path\on\server\myfile.dat");
do {
b = str.ReadByte(); //read next byte from stream
...
} while (b != -1);
(ví dụ lấy từ http://blog.joachim.at/?p=33)
Rõ ràng, phải không? Máy chủ trả về luồng cho máy khách và máy khách gọi Đọc trên đó.
Có thể cho khách hàng cung cấp Luồng và máy chủ gọi Ghi trên đó không?
Nói cách khác, thay vì mô hình kéo - nơi khách hàng kéo dữ liệu từ máy chủ - đó là mô hình đẩy, nơi khách hàng cung cấp luồng "chìm" và máy chủ ghi vào đó. Mã phía máy chủ có thể trông giống như sau:
[ServiceContract]
public interface IStreamWriterService
{
[OperationContract]
void SendData(Stream clientProvidedWritableStream);
}
public class DataService : IStreamWriterService
{
public void GetData(Stream s)
{
do {
byte[] chunk = GetNextChunk();
s.Write(chunk,0, chunk.Length);
} while (chunk.Length > 0);
}
}
Điều này có thể thực hiện được trong WCF và nếu có, làm cách nào? Cài đặt cấu hình cần thiết cho ràng buộc, giao diện, v.v. là gì? Thuật ngữ là gì?
Có thể nó sẽ hoạt động? (Tôi chưa thử)
Cảm ơn.
PS Tôi nên thêm vào câu trả lời - lấy số lượng dữ liệu thực sự cần phải được phát trực tuyến. Điều này rất hữu ích cho một vài MB hoặc nhiều hơn, nhưng nếu bạn chỉ có một vài KB để gửi thì nó sẽ chi phí ít hơn để chỉ tạo ra một 'MemoryStream' cho thành phần của bạn để ghi vào và sau đó trả lại điều đó. – Aaronaught
Whoa, yes !. Bây giờ hãy để tôi hiểu điều này. Vui lòng xác nhận; (1) Dòng AnonymousPipe {Client, Server} là một cặp các lớp chỉ được sử dụng phía máy chủ. (2) Những gì được trả lại cho khách hàng là một System.IO.Stream. – Cheeso
ps: Tôi đã hỏi câu hỏi này trước, xem http://stackoverflow.com/questions/1499520. Tôi rất vui khi nhận được một câu trả lời chung, đơn giản. – Cheeso