我一直在努力掌握这一点,我不是专家网站开发人员。
我们公司正在构建一个文档处理系统,大多数是几MB的普通文档文档,但文件大小不应有限。我们希望WPF和Web都有瘦客户端。
我们的第一个假设是所有通信和数据流应仅通过我们的Wcf服务。 REST服务是使用ChannelFactory和共享契约创建的。一个小小的愿望也是从客户端抽象出Azure blob存储。单个Web界面的优势在于您可以严格控制授权,一个最终用户不会看到其他用户文档更容易保持安全。
但是现在我认为单一服务和数据通道的想法在涉及到云时有些无效/困难,并且您最好以不同的方式处理下载和上传。今天我倾向于:
对于下载,也许最好向客户端发出一个临时的http / https-URL,可用于直接从Azure商店打开文件?
对于上传,最好将文件以1MB块,多次调用发送到我们的网络服务,并在webservice中使用PutBlock + PutBlockList方法整个文件更新和提交。
更新:澄清我已经尝试过的内容:
我已实现了以文件形式发送和接收文件的休息函数
[OperationContract]
[WebGet(UriTemplate = "DownloadFile/{id}")]
Stream DownloadFile(string id);
[OperationContract]
[WebInvoke(UriTemplate = "UploadFile/{id}")]
string UploadFile(string id, Stream upload);
只要我从文件系统工作,上述两种方法就可以工作,但是当我想从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上传?
欢迎任何想法或见解!