Правильно ли, что в WCF я не могу писать службу в поток, полученный клиентом?
Потоки поддерживаются в WCF для запросов, ответов или обоих. Я хотел бы поддержать сценарий, в котором генератор данных (либо клиент в случае потокового запроса, либо сервер в случае потокового ответа) может писать в потоке. Поддерживается ли это?
Аналогом является Response.OutputStream из запроса ASP.NET. В ASPNET любая страница может вызывать запись в выходном потоке, а контент получен клиентом. Могу ли я сделать что-то подобное в службе WCF - вызвать Write в потоке, полученном клиентом?
Позвольте мне объяснить с помощью иллюстрации WCF. Простейший пример Streaming в 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)
Ясно, да? Сервер возвращает Stream клиенту, и клиент вызывает Read на нем.
Возможно ли, чтобы клиент предоставил Stream, а сервер для вызова Write на нем?
Другими словами, вместо того, чтобы тянуть модель, где клиент извлекает данные с сервера, это модель push, где клиент предоставляет поток "потоковый" и сервер записывает в него. Код на стороне сервера может выглядеть примерно так:
[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, и если да, то как? Каковы настройки конфигурации, необходимые для привязки, интерфейса и т.д.? Что такое терминология?
Может, это сработает? (Я не пробовал)
Спасибо.