2010-08-27 56 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文章。這是你在找什麼?