我正在为SiteScope编写诊断页面,我们需要测试的一个区域是,是否可以从Web服务器访问文件/媒体资产的连接。我认为我可以这样做的一种方法是通过代码加载图像并测试以查看IIS状态消息是否为200.
所以基本上我应该能够在站点内导航到这样的文件夹:/media/1/image.jpg并查看它是否返回200 ...如果不抛出异常。
我正在努力弄清楚如何编写这段代码。
非常感谢任何帮助。
由于
答案 0 :(得分:44)
只需使用HEAD。如果您不需要,无需下载整个图像。这里有一些样板代码。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
request.Method = "HEAD";
bool exists;
try
{
request.GetResponse();
exists = true;
}
catch
{
exists = false;
}
答案 1 :(得分:16)
您可能还想检查是否有一个OK状态代码(即HTTP 200),并且响应对象中的mime类型与您期望的相匹配。您可以按照
的方式进行扩展public bool doesImageExistRemotely(string uriToImage, string mimeType)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage);
request.Method = "HEAD";
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK && response.ContentType == mimeType)
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
答案 2 :(得分:7)
你必须处理HTTPWebResponse对象,否则你会遇到问题......
public bool DoesImageExistRemotely(string uriToImage)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage);
request.Method = "HEAD";
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
}
}
catch (WebException) { return false; }
catch
{
return false;
}
}
答案 3 :(得分:6)
之前我曾经使用过类似的东西,但可能有更好的方法:
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://somewhere/picture.jpg");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
myImg.ImageUrl = "http://somewhere/picture.jpg";
}
catch (Exception ex)
{
// image doesn't exist, set to default picture
myImg.ImageUrl = "http://somewhere/default.jpg";
}
答案 4 :(得分:1)
如果您在请求期间收到异常,例如“远程服务器返回错误:(401)未经授权。”,
这可以通过添加以下行来解决
request.Credentials = new NetworkCredential(username, password);
问题和答案从check if image exists on intranet添加到此问题中。
答案 5 :(得分:1)
如果url像http:\ server.myImageSite.com一样存在,答案也是错误的 仅当imageSize> 0是真的。
public static void GetPictureSize(string url, ref float width, ref float height, ref string err)
{
System.Net.HttpWebRequest wreq;
System.Net.HttpWebResponse wresp;
System.IO.Stream mystream;
System.Drawing.Bitmap bmp;
bmp = null;
mystream = null;
wresp = null;
try
{
wreq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
wreq.AllowWriteStreamBuffering = true;
wresp = (HttpWebResponse)wreq.GetResponse();
if ((mystream = wresp.GetResponseStream()) != null)
bmp = new System.Drawing.Bitmap(mystream);
}
catch (Exception er)
{
err = er.Message;
return;
}
finally
{
if (mystream != null)
mystream.Close();
if (wresp != null)
wresp.Close();
}
width = bmp.Width;
height = bmp.Height;
}
public static bool ImageUrlExists(string url)
{
float width = 0;
float height = 0;
string err = null;
GetPictureSize(url, ref width, ref height, ref err);
return width > 0;
}
答案 6 :(得分:-1)
我会调查一个HttpWebRequest - 我认为之前的答案实际上会下载数据,而你应该能够在没有来自HttpWebRequest的数据的情况下获得响应。
http://msdn.microsoft.com/en-us/library/456dfw4f.aspx直到第4步应该可以解决问题。如果需要,HttpWebResponse还有其他字段用于获取数字代码...
HTH 千斤顶