如何通过URL检查Web服务器上是否存在文件?

时间:2009-09-22 13:58:31

标签: c# .net http

在我们的应用程序中,我们提供了某种在线帮助。它非常简单:如果用户单击帮助按钮,则会根据当前语言和帮助上下文(例如“http://example.com/help/”+ [LANG_ID] +“[HELP_CONTEXT])构建URL,并在浏览器中调用。

所以我的问题是:如何在不加载完整文件内容的情况下检查Web服务器上是否存在文件?

感谢您的帮助!

更新:感谢您的帮助。我的问题已得到解答。 现在我们有代理身份验证问题,无法发送HTTP请求;)

7 个答案:

答案 0 :(得分:20)

您可以使用.NET执行HEAD请求,然后查看响应的状态。

您的代码看起来像这样(改编自The Lowly HTTP HEAD Request):

// create the request
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

// instruct the server to return headers only
request.Method = "HEAD";

// make the connection
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

// get the status code
HttpStatusCode status = response.StatusCode;

这是一个详细列出StatusCode枚举器可以返回的status codes的列表。

答案 1 :(得分:2)

我们是否可以假设您在检索帮助页面的同一Web服务器上运行Web应用程序?如果是,那么您可以使用Server.MapPath方法查找服务器上文件的路径,并结合System.IO命名空间中的File.Exists方法来确认该文件是否存在。

答案 2 :(得分:1)

发送URL的HEAD请求(而不是GET)。如果服务器不存在,服务器将返回404。

答案 3 :(得分:1)

看一下HttpWebResponse课程。你可以这样做:

string url = "http://example.com/help/" + LANG_ID + HELP_CONTEXT;
WebRequest request=WebRequest.Create(URL);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusDescription=="OK") 
{
   // worked
}

答案 4 :(得分:0)

编辑:显然,执行此操作的好方法是HEAD请求。

您还可以创建一个服务器端应用程序,用于存储服务器上每个可用网页的名称。然后,您的客户端应用程序可以查询此应用程序并比完整页面请求更快地响应,并且每次文件不存在时都不会抛出404错误。

答案 5 :(得分:0)

如果要检查服务器上文档的状态:

function fetchStatus(address) {
 var client = new XMLHttpRequest();
 client.onreadystatechange = function() {
  // in case of network errors this might not give reliable results
  if(this.readyState == 4)
   returnStatus(this.status);
 }
 client.open("HEAD", address);
 client.send();
}

谢谢。

答案 6 :(得分:0)

我自己遇到了同样的问题,并发现了这个问题和答案确实很有用。

但是这里的答案使用的是旧的WebRequest-class,它有点过时了,它没有对启动器的异步支持。因此,我想使用更现代的方法来实现HttpClient。这是一个带有一些辅助类的示例,用于检查文件是否存在:

using System.Net.Http;
using System.Threading.Tasks;

class HttpClientHelper
{
    private static HttpClient _httpClient;

    public static async Task<bool> DoesFileExist(string url)
    {
        if (_httpClient == null)
        {
            _httpClient = new HttpClient();
        }

        using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, url))
        {
            using (HttpResponseMessage response = await _httpClient.SendAsync(request))
            {
                return response.StatusCode == System.Net.HttpStatusCode.OK;
            }
        }
    }
}

用法:

if (await HttpClientHelper.DoesFileExist("https://www.google.com/favicon.ico"))
{
    // Yes it does!  
}
else
{
    // No it doesn't!
}