【问题标题】:Problem with WCF StreamingWCF 流的问题
【发布时间】:2011-01-28 18:19:44
【问题描述】:

我在看这个帖子:How to handle large file uploads via 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);
            }
        }

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

现在我引用它并将其传递给一个 FileStream,但参数现在是一个字节 [] - 为什么会这样以及如何获得它的正确流式传输方式?

编辑 我的绑定看起来像这样:

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

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

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

【问题讨论】:

  • 你能制作一个wsdl吗?如果是这样,您可以将其添加到您的描述中。我相信这可能是您绑定中的配置问题。
  • 我认为当我可以使用它并通过我的浏览器浏览它时,我可以生成 wsdl?
  • 你如何“参考它”?是 ServiceReference 吗?
  • 咳咳!你是正确的。我刚刚检查过,它不是服务参考,而是网络参考......这解决了我的问题 - 现在

标签: wcf streaming


【解决方案1】:

这是否作为服务参考包含在您的项目中?

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

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

【讨论】:

  • 这并没有改变任何东西,当我在我的客户端时,“复合”对象的流仍然是 byte[]
  • 阅读我的编辑 2,感谢一堆,我第一次阅读您的帖子时忽略了您的第一行 :-)
猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 2010-12-18
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多