2

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

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

  • 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();
        }
    }
}

在某些地方,该方法是使用与协议无关的 url 调用的,例如"//www.somedomain.com/niceimage.png".

此类 url 会引发异常:

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

有没有办法使用与协议无关的 url,而不是仅仅"http:"在 url 前面?

4

2 回答 2

3

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

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

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

于 2012-11-08T14:38:26.413 回答
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();
        }
    }
}
于 2012-11-08T15:53:25.543 回答