2010-03-17 52 views
3

我一直在寻找这个线程:How to handle large file uploads via WCF?问题与WCF流

我需要有一个Web服务在我的供应商,我需要上传和下载文件到托管。我们正在谈论从1Mb到100Mb的视频,因此是流媒体方式。

我不能得到它的工作,我宣布一个接口:

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

仍然没有问题,它发布到我的网络服务器在interweb上。到现在为止还挺好。

现在我对它做一个参考,并会将其一个FileStream,但现在的说法是一个byte [] - 这是为什么?我如何得到它流的正确方法?

编辑 我结合这个样子的:

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

我可以使用它没有问题,并没有错误 - 比我的输入参数等已经从流变为一个byte []

编辑2 解决了!当我在客户端提供参考时,我有点快。无意中,我做了一个“Web参考”,而不是“服务参考”。这解决了字节[] /流问题

+0

你能不能做一个wsdl?如果是这样,你可以添加到你的描述。我相信这可能是您绑定中的配置问题。 – 2010-03-17 20:27:03

+0

我认为,当我可以通过浏览器浏览并浏览它时,我可以生成wsdl? – 2010-03-17 20:30:44

+0

你如何“参考它”?它是一个ServiceReference吗? – 2010-03-17 20:56:48

回答

2

难道这包括在项目中的服务引用?

我通常有我的流媒体服务,稍微更复杂的对象,例如,而不是这样的:

[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。

+0

这并没有改变任何东西,“复合体”对象的流仍的byte []当我的客户 – 2010-03-17 20:58:25

+0

上IM阅读我的编辑2,thx一堆,第一次看到你的帖子时忽略了你的第一行:-) – 2010-03-17 21:03:21