Правильно ли, что в WCF у меня не может быть службы запись в поток, полученный клиентом?
Потоковая передача поддерживается в WCF для запросов, ответов или обоих.
Я хотел бы поддержать сценарий, в котором генератор данных (либо клиент в случае потокового запроса, либо сервер в случае потокового ответа) может выполнять запись в поток. Это поддерживается?
Аналогия - Response.OutputStream из запроса ASP.NET. В ASPNET любая страница может вызывать запись в выходной поток, и содержимое получает клиент. Могу ли я сделать нечто подобное в службе WCF - вызвать запись в поток, полученный клиентом?
Позвольте мне объяснить с помощью иллюстрации WCF. Простейшим примером потоковой передачи в WCF является служба, возвращающая FileStream клиенту. Это потоковый ответ. Код сервера для реализации этого выглядит так:
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream GetData(string fileName);
}
public class StreamService : IStreamService
{
public Stream GetData(string filename)
{
return new FileStream(filename, FileMode.Open)
}
}
И код клиента выглядит так:
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);
(пример взят из http://blog.joachim.at/?p=33)
Ясно, верно? Сервер возвращает поток клиенту, а клиент вызывает для него чтение.
Возможно ли, чтобы клиент предоставил поток, а сервер вызвал запись на него?
Другими словами, это не модель извлечения, когда клиент извлекает данные с сервера, а модель проталкивания, когда клиент предоставляет поток «приемника», а сервер записывает в него данные. Код на стороне сервера может выглядеть примерно так:
[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);
}
}
Возможно ли это в WCF, и если да, то как? Какие параметры конфигурации требуются для привязки, интерфейса и т. Д.? Какая терминология?
Может, это просто сработает? (Я не пробовал)
Спасибо.