Проблема с потоковой передачей WCF - PullRequest
3 голосов
/ 17 марта 2010

Я смотрел на эту тему: Как обрабатывать загрузки больших файлов через WCF?

Мне нужно, чтобы у моего провайдера была размещена веб-служба, куда я должен загружать и скачивать файлы. Мы говорим видео от 1 МБ до 100 МБ, следовательно, потоковый подход.

Я не могу заставить его работать, я объявил интерфейс:

[ServiceContract]
    public interface IFileTransferService
    {

        [OperationContract]
        void UploadFile(Stream stream);
    }

и все в порядке, я реализую это так:

 public string FileName = "test";

        public void UploadFile(Stream stream)
        {
            try
            {
                FileStream outStream = File.Open(FileName, FileMode.Create, FileAccess.Write);
                const int bufferLength = 4096;
                byte[] buffer = new byte[bufferLength];
                int count = 0;
                while((count = stream.Read(buffer, 0, bufferLength)) > 0)
                {
                    //progress
                    outStream.Write(buffer, 0, count);
                }
                outStream.Close();
                stream.Close();
                //saved
            }
            catch(Exception ex)
            {
                throw new Exception("error: "+ex.Message);
            }
        }

Все еще нет проблем, он опубликован на моем веб-сервере в сети Интернет. Пока все хорошо.

Теперь я делаю ссылку на него и передаю ему FileStream, но аргумент теперь является байтом [] - почему это так и как мне получить его правильным способом для потоковой передачи?

Редактировать Мой переплет выглядит так:

 <bindings>
      <basicHttpBinding>
        <binding name="StreamingFileTransferServicesBinding"
                 transferMode="StreamedRequest"
                 maxBufferSize="65536"
                 maxReceivedMessageSize="204003200"  />
      </basicHttpBinding>
    </bindings>

Я могу использовать его без проблем и без ошибок - кроме того, что мой входной параметр изменился с потока на байт []

Редактировать 2 Решено! Я был немного быстр, когда сделал ссылку на моего клиента. Случайно я сделал «веб-ссылку» вместо «сервисной ссылки». Это решило проблему с байтами [] / stream

1 Ответ

2 голосов
/ 17 марта 2010

Включено ли это в качестве справочника услуг в ваш проект?

У меня обычно есть сервис потоковой передачи, например, с немного более сложными объектами:

[OperationContract]
void UploadFile(Stream stream);

попробовать

[OperationContract]
void UploadFile(FileDTO stream);

[MessageContract]
public class FileDTO : IDisposable
{
    [MessageBodyMember]
    public Stream FileStream { get; set; }

    [MessageHeader]
    public String FileLabel { get; set; }
}

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

client.UploadFile(fileLabel, fileStream);

с параметрами String и Stream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...