2010-08-27 45 views
0

我一直在创建一个新的服务来将大文件下载到客户端。我想在Windows服务中托管该服务。 在服务我写:在WCF和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 请帮助我。

回答

5

我发现非常漂亮的代码在你的服务:

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;   
} 

请勿关闭服务上的流。关闭流是客户的责任。

+0

Whohoo ..它的工作。 只是另一个问题,你能告诉我如何增加消息的大小。它告诉我增加MaxReceivedMessageSize。 – abhishek 2010-08-27 13:02:12

+0

您必须在客户端上设置maxReceiveMessageSize。 – 2010-08-27 13:05:42

+0

哇。我刚刚将客户端中的传输模式更改为流式传输,并且它的工作方式很神奇。 transferMode =“Streamed” 非常感谢您的帮助。 干杯。 – abhishek 2010-08-27 14:31:44

2

this文章。这是你在找什么?