WCF流的问题

时间:2010-03-17 20:21:07

标签: wcf streaming

我正在看这个帖子:How to handle large file uploads via WCF?

我需要在我的提供商处托管一个网络服务,我需要上传和下载文件。我们正在讨论从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);
            }
        }

仍然没有问题,它在互联网上发布到我的网络服务器上。到目前为止一切都很好。

现在我引用它并将它传递给FileStream,但是参数现在是一个byte [] - 为什么这样,我如何才能得到正确的流式传输方式?

修改 我的绑定看起来像这样:

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

我可以毫无问题地使用它,并且没有错误 - 除了我的输入参数已从流更改为字节[]

编辑2 解决了!当我在我的客户端上做参考时,我有点快。偶然我做了一个“网络参考”而不是“服务参考”。这解决了byte [] / stream问题

1 个答案:

答案 0 :(得分: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。