Функция WCF не возвращает поток - PullRequest
1 голос
/ 12 мая 2011

Итак, у меня есть функция, которая возвращает поток PDF.Вызывающая процедура получает поток и записывает его на диск (спасибо ServiceGuy!).Обычный код VB выглядит следующим образом:

Public Function GetPDF() As System.IO.FileStream

    GetPDF = File.OpenRead("C:\Documents and Settings\jspel903\Desktop\3211LD.pdf")

End Function

Теперь, по любой причине, когда я помещаю этот код в свой WCF (см. Ниже) и собираю / устанавливаю, он ничего не возвращает.Вызывающая процедура ничего не получает после того, как Мой WCF размещен в службе Windows (я не могу заставить ее отладить или войти).Поэтому мне интересно, может быть, WCF не вернут FileStream?

Вот IService:

<ServiceContract()> _
Public Interface IService1

<OperationContract()> _
Function GetPDF() As System.IO.FileStream
'Should return a .pdf file as a stream

End Interface

Вот svc:

Imports System.IO

Public Class Service1
Implements IService1


Public Function GetPDF() As System.IO.FileStream Implements IService1.GetPDF

    GetPDF = File.OpenRead("C:\Documents and Settings\jspel903\Desktop\3211LD.pdf")

End Function
End Class

Кажетсямне как то должно работать.Есть идеи?

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Это не сработает ... Подумайте, что бы это значило, если бы это произошло.Ваш клиент WCF будет иметь доступ к потоку файлов на вашем серверном устройстве.Он должен был бы иметь возможность выполнять все операции, которые вы могли бы выполнять локально, через удаленное соединение.

WCF - это транспортный механизм для данных , фактически он не отправляетссылки на объекты на объектах сервера.Клиент получает копию объекта, которая была сериализована сервером, а затем десериализована на стороне клиента.Если бы вы могли отправить объект потока, дескриптор файла / ссылка на память и т. Д. Ничего бы не значило для принимающего клиента.

Вам необходимо прочитать данные из потока на сервере изатем преобразуйте его в соответствующий объект данных для передачи обратно клиенту.

EDIT:

Очевидно, вы можете использовать потоковую передачу с WCF, но вы не сможете вернуть систему.IO.FileStream, вы можете вернуть Stream.

Взгляните на: Большие данные и потоковую передачу , чтобы получить описание и некоторые ограничения, о которых вам нужно знать, если выпринять этот подход.

1 голос
/ 12 мая 2011

Возможно, вы захотите преобразовать ваш FileStream в байтовый массив и вернуть его.WCF обычно ограничен возвращением сериализуемых типов.

   // fs is your FileStream

   byte[] Data = new byte[fs.Length];

   fs.Read(Data,0,fs.Length);
...