Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过Restful API从云下载大型文件的最佳实践_C#_Azure_Rest_Api_Cloud - Fatal编程技术网

C# 通过Restful API从云下载大型文件的最佳实践

C# 通过Restful API从云下载大型文件的最佳实践,c#,azure,rest,api,cloud,C#,Azure,Rest,Api,Cloud,我正在尝试构建一个Restful API,以便用户通过我的API从云存储下载zip文件 这样做的原因: 防止直接访问我们的内部云存储 隐藏正在使用的技术(存储品牌等) 控制用户请求(记录、验证) 在我的APi上应该有两种方法来实现这一点: 下载为字节[]并返回 下载为临时文件,读取为字节[]并返回 这两种方式都需要将文件下载到内存或tempfile中,等待文件传输完成(等待用户下载完成或仅发送到HTTP??),然后释放内存或删除temp文件 如果一个文件的大小是2GB(让我们假设这对于服务器来说

我正在尝试构建一个Restful API,以便用户通过我的API从云存储下载zip文件

这样做的原因:

  • 防止直接访问我们的内部云存储
  • 隐藏正在使用的技术(存储品牌等)
  • 控制用户请求(记录、验证)
  • 在我的APi上应该有两种方法来实现这一点:

  • 下载为字节[]并返回

  • 下载为临时文件,读取为字节[]并返回

  • 这两种方式都需要将文件下载到内存或tempfile中,等待文件传输完成(等待用户下载完成或仅发送到HTTP??),然后释放内存或删除temp文件

    如果一个文件的大小是2GB(让我们假设这对于服务器来说是一个很大的容量),是否有任何方法可以最小化服务器端的负载,可能类似于逐块下载,只保留一小部分正在使用的内存

    提前谢谢


    杰米

    是的,做你需要的事情的一个更好的方法是:

  • 将文件托管在存储帐户的
    私有blob
  • 当您收到文件的HTTP请求时,为Blob生成一个
    SAS
    令牌,并仅返回文件的
    SAS URL
    作为响应。SAS令牌的有效性可能因您的需求而异,但最好将其保持在最低限度
  • 因此,客户机基本上会获得一个公共URL,该URL在有限的时间内有效,以获取zip文件,而不会占用您的服务资源

  • 嗨,比特,谢谢你的回答。你介意告诉我,如果用户下载的文件在你的本地驱动器上,并且非常大,无法读入内存,你会怎么做。这实际上是另一个问题,但是,我会使用并且已经使用
    MultipartStreamProvider
    将其直接上载到Blob存储。您应该使用Streams,而不是在内存中下载整个内容。@Junnas谢谢您的评论,我认为我的概念是错误的,在服务器端下载整个内容,你知道我可以从中学习到什么具体的例子吗?这里有一个你也可以很容易地找到C#streams的教程:)
    public static byte[] GetReportFile(GetReportRequest request, string refId)
    {
        //C# byte limit is 2GB
        byte[] file = null;
        try
        {
            var report = ReportDao.GetReport(request.ReportId);
            var tempFilePath = new StorageService().DownloadByUriToTempFile(report.CloudPath);
        }
        catch (Exception ex)
        {
        }
        return file;
    }