从azure数据湖下载文件

时间:2018-01-04 11:29:58

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

我在azure data lake上传文件。我尝试通过asp.net mvc application下载该文件。我有该文件的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;
}

图片:
enter image description here

2 个答案:

答案 0 :(得分:0)

您应修改代码以使用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<HttpResponseMessage>,并添加async修饰符。

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

您的代码可能仍会超时。我相信对请求在中止之前可以花多长时间有一个可配置的限制,如果你仍然有超时,你应该调查一下。

答案 1 :(得分:0)

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

  

HttpClient.Timeout

     

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

     

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

此外,如果您通过Azure Web App托管应用程序,则Azure Load Balancer可能会遇到4分钟的空闲超时设置。您可以更改Azure VM和Azure Cloud Service中的空闲超时设置。您可以关注的详细信息here