在Web应用程序中,我必须首先检查图像是否存在,然后显示此图像或虚拟图像。
我使用以下代码,它适用于URLS,如:
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:"
添加到网址?
答案 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();
}
}
}