【问题标题】:Download files from the azure data lake从 azure 数据湖下载文件
【发布时间】:2018-01-04 11:29:57
【问题描述】:

我将我的文件上传到 azure 数据湖中。我尝试通过 asp.net mvc 应用程序下载该文件。我有该文件的 adl 路径。我可以下载低于 150 MB 的文件。但我无法下载超过 150 MB 的文件。出现超时错误。

下面是我的代码...

public ActionResult Download(string adlpath)
{
    String header = adlpath;
    Console.WriteLine(header);
    string[] splitedStr = header.Split('/');
    var path = GenerateDownloadPaths(adlpath);
    string filename = path["fileName"];
    HttpResponseMessage val = DataDownloadFile(path["fileSrcPath"]);
    byte[] filedata = val.Content.ReadAsByteArrayAsync().Result;
    string contentType = MimeMapping.GetMimeMapping(filename);
    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = filename,
        Inline = true,
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());

    return File(filedata, contentType);
}

public HttpResponseMessage DataDownloadFile(string srcFilePath)
{
    string DownloadUrl = "https://{0}.azuredatalakestore.net/webhdfs/v1/{1}?op=OPEN&read=true";
    var fullurl = string.Format(DownloadUrl, _datalakeAccountName, srcFilePath);

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accesstoken.access_token);
        using (var formData = new MultipartFormDataContent())
        {
            resp = client.GetAsync(fullurl).Result;
        }
    }
    return resp;
}

图片:

【问题讨论】:

  • 请添加具体错误,因为文本不是屏幕打印。
  • 在本地我可以下载 135 MB 的文件。我在 azure 中托管我的应用程序,我尝试下载。在那里下载 1 KB 文件。
  • 不回答您的问题,但您应该考虑不要按照 ASP.NET Web API 文档中的Create and Initialize HttpClient 部分中的说明对每个请求创建新的HttpClient

标签: c# asp.net-mvc azure azure-data-lake


【解决方案1】:

您应该修改您的代码以使用asyncawait。您的实现在检索文件时阻塞,这可能是超时:

public async Task<HttpResponseMessage> DataDownloadFile(string srcFilePath)
{
    string DownloadUrl = "https://{0}.azuredatalakestore.net/webhdfs/v1/{1}?op=OPEN&read=true";
    var fullurl = string.Format(DownloadUrl, _datalakeAccountName, srcFilePath);

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accesstoken.access_token);
        using (var formData = new MultipartFormDataContent())
        {
            resp = await client.GetAsync(fullurl);
        }
    }
    return resp;
}

方法的返回值改为Task&lt;HttpResponseMessage&gt;并添加async修饰符。

调用client.GetAsync 更改为使用await,而不是通过检索Result 属性来阻止。

您的代码可能仍会超时。我相信在请求被中止之前可以花费多长时间可以配置限制,如果您仍然遇到超时,您应该对此进行调查。

【讨论】:

    【解决方案2】:

    根据我的理解,您可以尝试为您的 HttpClient 实例增加 HttpClient.Timeout(默认为 100 秒)。

    HttpClient.Timeout

    获取或设置请求超时前等待的时间跨度。

    默认值为 100,000 毫秒(100 秒)。

    此外,如果您通过 Azure Web App 托管应用程序,您可能会遇到来自 Azure 负载均衡器的 4 分钟空闲超时设置。您可以更改 Azure VM 和 Azure 云服务中的空闲超时设置。您可以关注here的详细信息。

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多