建议使用REST wcf服务将文件下载/上载到Azure blob存储的体系结构

时间:2012-06-27 15:09:07

标签: wcf rest azure-storage azure-storage-blobs

  

可能重复:
  Returning Azure Blob Stream directly from WCF service

我一直在努力掌握这一点,我不是专家网站开发人员。

我们公司正在构建一个文档处理系统,大多数是几MB的普通文档文档,但文件大小不应有限。我们希望WPF和Web都有瘦客户端。

我们的第一个假设是所有通信和数据流应通过我们的Wcf服务。 REST服务是使用ChannelFactory和共享契约创建的。一个小小的愿望也是从客户端抽象出Azure blob存储。单个Web界面的优势在于您可以严格控制授权,一个最终用户不会看到其他用户文档更容易保持安全。

但是现在我认为单一服务和数据通道的想法在涉及到云时有些无效/困难,并且您最好以不同的方式处理下载和上传。今天我倾向于:

对于下载,也许最好向客户端发出一个临时的http / https-URL,可用于直接从Azure商店打开文件?

对于上传,最好将文件以1MB块,多次调用发送到我们的网络服务,并在webservice中使用PutBlock + PutBlockList方法整个文件更新和提交。

更新:澄清我已经尝试过的内容:

  1. 我已实现了以文件形式发送和接收文件的休息函数

    [OperationContract]
    [WebGet(UriTemplate = "DownloadFile/{id}")]
    Stream DownloadFile(string id);
    
    [OperationContract]
    [WebInvoke(UriTemplate = "UploadFile/{id}")]
    string UploadFile(string id, Stream upload);
    
  2. 只要我从文件系统工作,上述两种方法就可以工作,但是当我想从blob存储中继它们时,这种方法就没有了。我无法获得从服务返回的流的引用。我试过例如:

        public Stream DownloadFile(string id)
        {
            var cont = GetContainer(GetClient());
            var blob = cont.GetBlobReference(id);
    
            BlobRequestOptions options = new BlobRequestOptions();
            options.Timeout = new TimeSpan(0, 2, 0);
    
            // What kind of stream should I return from the Azure storage?
            // Memorystream below works, but is ineffective since the whole file is loaded into memory!
            var memStream = new MemoryStream();
    
            blob.DownloadToStream(memStream, options);
    
            return memStream;
        }
    

    哪个有效,但不是我想要的,因为整个文件内容被下载到内存流而不被中继。

    我的下一个想法是,可能所有这些都很困难,因为它不是预期的解决方案。也许更容易(并且可能更好地扩展!)通过Web服务跳过流式传输,而是直接从存储URL下载并通过Web服务中的分块api上传?

    欢迎任何想法或见解!

0 个答案:

没有答案