Загрузка больших файлов в WCF и Windows Service - PullRequest
0 голосов
/ 27 августа 2010

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

 public class FileTransferService : IFileTransferService
    {
        private string ConfigPath
        {
            get
            {
                return ConfigurationSettings.AppSettings["DownloadPath"];
            }
        }
        private FileStream GetFileStream(string file)
        {

            string filePath = Path.Combine(this.ConfigPath, file);
            FileInfo fileInfo = new FileInfo(filePath);

            if (!fileInfo.Exists)
                throw new FileNotFoundException("File not found", file);

            return new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        }

        public RemoteFileInfo DownloadFile(DownloadRequest request)
        {
            FileStream stream = this.GetFileStream(request.FileName);

            RemoteFileInfo result = new RemoteFileInfo();
            result.FileName = request.FileName;
            result.Length = stream.Length;
            result.FileByteStream = stream;
            return result;
        }
    }

Интерфейс выглядит следующим образом:

 [ServiceContract]
    public interface IFileTransferService
    {
        [OperationContract]
        RemoteFileInfo DownloadFile(DownloadRequest request);
    }
    [DataContract]
    public class DownloadRequest
    {
        [DataMember]
        public string FileName;
    }

    [DataContract]
    public class RemoteFileInfo : IDisposable
    {
        [DataMember]
        public string FileName;

        [DataMember]
        public long Length;

        [DataMember]
        public System.IO.Stream FileByteStream;

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

Когда я звоню в сервис, он говорит: «Базовое соединение было закрыто».Вы можете получить реализацию http://cid -bafa39a62a57009c.office.live.com / self.aspx / .Public / MicaUpdaterService.zip Пожалуйста, помогите мне.

Ответы [ 2 ]

5 голосов
/ 27 августа 2010

Я нашел очень хороший код в вашем сервисе:

try
{
  host.Open();
}
catch {}

Это один из худших антипаттернов!Немедленно замените этот код на правильную обработку ошибок и ведение журнала.

Я не тестировал ваш сервис, а просто просмотрев конфигурацию и ваш код, я предположил, что он никогда не будет работать, потому что он не соответствует требованиям дляпотоковая передача по HTTP.Когда вы хотите передавать по HTTP, метод должен возвращать только один элемент тела, который имеет тип Stream.Вместо этого ваш метод возвращает данные контракта.Используйте эту версию:

[ServiceContract]     
public interface IFileTransferService     
{     
    [OperationContract]     
    DownloadFileResponse DownloadFile(DownloadFileRequest request);     
}     

[MessageContract]     
public class DownloadFileRequest     
{     
    [MessageBodyMember]     
    public string FileName;     
}     

[MessageContract]     
public class DownloadFileResponse    
{     
    [MessageHeader]     
    public string FileName;     

    [MessageHeader]     
    public long Length;     

    [MessageBodyMember]     
    public System.IO.Stream FileByteStream;         
} 

Не закрывайте поток на сервисе.Ответственность за закрытие потока лежит на клиенте.

2 голосов
/ 27 августа 2010

Посмотрите на эту статью. Это то, что вы ищете?

...