WebRequest和协议不可知的URL

时间:2012-11-08 10:12:54

标签: c# asp.net httpwebrequest

在Web应用程序中,我必须首先检查图像是否存在,然后显示此图像或虚拟图像。

我使用以下代码,它适用于URLS,如:

  • “的 HTTP ://www.somedomain.com/niceimage.png”
  • “的 HTTPS ://www.somedomain.com/niceimage.png”
public virtual bool WebResourceExists(string url)
{
    WebHeaderCollection headers = null;
    WebResponse response = null;
    try
    {
        WebRequest request = WebRequest.Create(url);
        request.Method = "HEAD";
        response = request.GetResponse();
        headers = response.Headers;
        bool result = int.Parse(headers["Content-Length"]) > 0;
        return result;
    }
    catch (System.Net.WebException)
    {
        return false;
    }
    catch (Exception e)
    {
        _log.Error(e);
        return false;
    }
    finally
    {
        if (response != null)
        {
            response.Close();
        }
    }
}

在某些地方,使用协议不可知的网址(如"//www.somedomain.com/niceimage.png")调用该方法。

此类网址会引发异常:

  

System.InvalidCastException: Unable to cast object of type 'System.Net.FileWebRequest' to type 'System.Net.HttpWebRequest'

有没有办法使用协议不可知的网址,然后将"http:"添加到网址?

2 个答案:

答案 0 :(得分:3)

浏览器使用当前协议解析与协议无关的URL,用于避免从HTTPS页面发出HTTP请求。

在服务器上执行的代码实际上没有“当前协议”的概念。虽然ASP.NET可以确定当前请求是通过HTTP还是HTTPS发出的,但WebRequest类不限于ASP.NET应用程序,因此它们不能依赖于此。

您需要指定协议。您使用HTTP还是HTTPS将取决于您是否担心第三方窃听服务器与“www.somedomain.com”之间的连接。

答案 1 :(得分:0)

如果是两步过程,检查http版本,如果不存在,请检查https。我很快就将一个如何工作的基本示例混在一起,但我无法正确测试和检查它,所以它可能需要一些整理/重构!

public virtual bool WebResourceExists(string url)
{
    WebHeaderCollection headers = null;
    WebResponse response = null;
    try
    {
        if (url.StartsWith(@"//") {
           url = "http:";
        }
        WebRequest request = WebRequest.Create(url);
        request.Method = "HEAD";
        response = request.GetResponse();
        headers = response.Headers;
        bool result = int.Parse(headers["Content-Length"]) > 0;
        return result;
    }
    catch (System.Net.WebException)
    {
        if (url.StartsWith(@"http://") {
           url = url.Replace("http://","https://");
        } else {
           return false;
        }
        try {
            WebRequest request = WebRequest.Create(url);
            request.Method = "HEAD";
            response = request.GetResponse();
           headers = response.Headers;
           bool result = int.Parse(headers["Content-Length"]) > 0;
           return result;
       }
       catch (System.Net.WebException)
       {
            return false;
       }
    }
    catch (Exception e)
    {
        _log.Error(e);
        return false;
    }
    finally
    {
        if (response != null)
        {
            response.Close();
        }
    }
}