WCF 流传输存在问题

3

我在查看这个帖子:如何通过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);
            }
        }

目前为止还没有问题,它已经发布到了我的互联网Web服务器上。一切都很顺利。

现在我要引用它并传递一个FileStream,但参数现在是byte[] - 为什么会这样,如何以正确的方式进行流处理?

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

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

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

编辑2 问题解决了!当我引用客户端时有点匆忙。我不小心做了一个“web reference”而不是一个“service reference”。这解决了byte[] / stream问题。


你能否制作一个WSDL文件?如果可以的话,请将其添加到您的描述中。我认为这可能是绑定中的配置问题。 - Lucas B
我理解当我可以通过浏览器使用它并浏览它时,我就可以生成WSDL? - Brian Hvarregaard
你如何“引用它”?是ServiceReference吗? - H H
Henk!你说得对。我刚刚检查了一下,它不是服务引用,而是Web引用...这暂时解决了我的问题。 - Brian Hvarregaard
1个回答

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。


这并不会改变任何事情,当我在客户端时,“composite”对象的流仍然是byte[]。 - Brian Hvarregaard
请看我的第二次编辑,非常感谢,第一次阅读您的帖子时忽略了您的第一行 :-) - Brian Hvarregaard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接