测试C#中是否存在图像

时间:2008-10-10 16:13:53

标签: c# .net iis

我正在为SiteScope编写诊断页面,我们需要测试的一个区域是,是否可以从Web服务器访问文件/媒体资产的连接。我认为我可以这样做的一种方法是通过代码加载图像并测试以查看IIS状态消息是否为200.

所以基本上我应该能够在站点内导航到这样的文件夹:/media/1/image.jpg并查看它是否返回200 ...如果不抛出异常。

我正在努力弄清楚如何编写这段代码。

非常感谢任何帮助。

由于

7 个答案:

答案 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 千斤顶