Как показать обратную связь при потоковой передаче больших файлов с помощью WCF - PullRequest
2 голосов
/ 07 октября 2010

Я отправляю большие файлы через WCF, и я использую TransferMode = "Streamed", чтобы заставить это работать, и оно работает нормально.

Дело в том, что иногда эти файлы просто слишком великии я хочу дать клиенту своего рода отзыв о прогрессе.

У кого-нибудь есть хорошее решение / идея о том, как этого добиться?

РЕДАКТИРОВАТЬ: я не приказываю чтение файла с любой стороны (клиента или сервера), если я сделал ямог просто дать отзыв о функции чтения потока.

EDIT2: часть моего кода, чтобы помочь другим понять мою проблему

Вот мой контракт

    [OperationContract]
    FileTransfer Update(FileTransfer request);

и вот определение FileTransfer

[System.ServiceModel.MessageContractAttribute(WrapperName = "FileTransfer", WrapperNamespace = "http://tempuri.org/", IsWrapped = true)]
public class FileTransfer : IDisposable
{
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace = "dummy", Order = 0)]
    public Stream FileByteStream;

    public void Dispose()
    {
        if (FileByteStream != null)
        {
            FileByteStream.Close();
            FileByteStream = null;
        }
    }

}

Итак, в моем сервисе (размещенном на IIS) у меня просто что-то вроде этого:

request.FileByteStream;

и WCF сам читает поток, верно?

Надеюсь, это поможет людям понятьмоя проблема ... пожалуйста, дайте мне знать, если вам нужна дополнительная информация

Ответы [ 2 ]

0 голосов
/ 08 октября 2010

Единственный способ, который я вижу сейчас, - это создать еще одну операцию, которая сообщает количество байтов, прочитанных поточной операцией. Для этого потребуется активировать сеансы и многопоточность на стороне сервера и реализовать асинхронный вызов от клиента вместе с вызовами операции «Отчет о прогрессе».

Клиент знает размер потока (при условии, что клиент является отправителем), он может извлечь процент выполнения из известного общего размера и сообщенного размера с сервера.

EDIT: Мой комментарий работает в предположении, что клиент загружает данные. Таким образом, сервер знает много данных, которые он уже прочитал из потока, в то время как клиент знает размер данных. Если сервер выставляет операцию, которая сообщает объем данных, которые он до сих пор считал, клиент сможет рассчитать процент выполнения, вызвав эту операцию.

0 голосов
/ 08 октября 2010

Как насчет добавления общего размера потока в качестве настраиваемого заголовка Soap (используйте MessageContracts). Затем вы можете обрабатывать поток на клиенте порциями (например, чтение в буфер определенного размера в цикле), и для каждой порции вы можете уведомлять клиента о обработанном приращении в контексте ожидаемого размера.

...