HttpClient - 检测内容类型

时间:2016-01-19 13:31:49

标签: c# .net content-type dotnet-httpclient

我需要检测位于特定网址上的某种内容。所以我创建了一个获取Content-Type响应的方法。对于小文件和HTML页面,它可以正常工作,但如果URL指向一个大文件,请求需要很长时间 - 它在后台获取整个内容(文件)。那么,有可能在收到Content-Type标题后立即取消请求并返回结果?

我目前的实施:

    public async static Task<string> GetContentType(string url)
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                var response = await client.GetAsync(url);
                if (!response.IsSuccessStatusCode)
                {
                    return null;
                }

                return response.Content.Headers.ContentType.MediaType;
            }
        }
        catch (HttpRequestException)
        {
            return null;
        }
    }

2 个答案:

答案 0 :(得分:5)

由于并非所有服务器都按预期响应HEAD请求,因此您也可以使用此GetAsync方法的重载,以便在使用HttpCompletionOption.ResponseHeadersRead作为第二个参数时,方法在收到标头后立即返回。

  

HTTP完成选项值,指示操作的时间   应该被视为已完成。

来自MSDN的ResponseHeadersRead:

  

一旦有响应,操作就应该完成   标题被读取。内容尚未阅读。

然后,如果需要,您可以处置客户端。

// Send request to get headers
 response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead);

// Check status code
if (!response.IsSuccessStatusCode) {
  // Error...
}

// Get Content Headers
HttpContentHeaderCollection contentHeaders = response.Content.Headers;


// Make decision and dispose client if you wish
if (...) {
   client.Dispose();
}

答案 1 :(得分:4)

现在怎么样

var response = await client.SendAsync(
  new HttpRequestMessage(HttpMethod.Head, url)
);