【问题标题】:Image URL validation in C#C# 中的图像 URL 验证
【发布时间】:2011-04-24 07:43:15
【问题描述】:

如何检查我的image 链接是否对 IE 和 FF 都有效?例如此链接仅在 FF 中有效,在 IE 浏览器中不显示图像。我检查了图像,颜色空间是 RGB。所以排除了图像空间问题。

谢谢。

【问题讨论】:

  • 是的,访问链接的目标,看看是否连接正确。也许你的意思不同。从你的问题的措辞很难看出。
  • 假设我有一个方法:ValidateLink 和 2 个参数:链接和浏览器。所以我想测试如果我从 FF 或 IE 访问我的链接是否有效:ValidateLink("google.com", "FireFox") 和 ValidateLink("google.com", "InternetExplorer")。
  • 什么是在 IE 中工作但在 FireFox 中工作的示例图像 URL?
  • 是网址还是图片格式有问题? en.wikipedia.org/wiki/…
  • 例如我有这个图片 url :dl.cat-verlag.de/catw1/news-ppw-bilder/10149341.jpg 女巫在 FF 中工作,但在 IE 中没有。

标签: c# validation browser hyperlink


【解决方案1】:

获取 fiddler 的副本以查看每个浏览器的响应差异。你可能会发现 header 是错误的,FF 正在纠正,但 IE 没有。

http://www.fiddler2.com/fiddler2/

希望对你有帮助

【讨论】:

  • 好的,fiddler 它是一个工具,但是如何用 c# 制作呢?我认为这对安德烈很有帮助。
【解决方案2】:

这是一个类,可让您验证任何类型的 URI,并将支持 URI 集合的多线程验证

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Threading;

namespace UrlValidation
{
    public class UrlValidator
    {
        internal static readonly Hashtable URLVerifications = new Hashtable();
        internal readonly List<ManualResetEvent> Handles = new List<ManualResetEvent>();

        internal void ValidateUrls()
        {
            var urlsToValidate = new[] { "http://www.ok12376876.com", "http//:www.ok.com", "http://www.ok.com", "http://cnn.com" };
            URLVerifications.Clear();
            foreach (var url in urlsToValidate)
                CheckUrl(url);
            if (Handles.Count > 0)
                WaitHandle.WaitAll(Handles.ToArray());

            foreach (DictionaryEntry verification in URLVerifications)
                Console.WriteLine(verification.Value);
        }

        internal class RequestState
        {
            public WebRequest Request;
            public WebResponse Response;
            public ManualResetEvent Handle;
        }

        private void CheckUrl(string url)
        {
            var hashCode = url.GetHashCode();
            var evt = new ManualResetEvent(false);
            Handles.Add(evt);

            if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
            {
                URLVerifications[hashCode] = "Invalid URL.";
                evt.Set();
                return;
            }

            if (!URLVerifications.ContainsKey(hashCode))
                URLVerifications.Add(hashCode, null);
            // Create a new webrequest to the mentioned URL.   
            var wreq = WebRequest.Create(url);
            wreq.Timeout = 5000; // 5 seconds timeout per thread (ignored for async calls)
            var state = new RequestState{ Request = wreq, Handle = evt };
            // Start the Asynchronous call for response.
            var asyncResult = wreq.BeginGetResponse(RespCallback, state);
            ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, TimeoutCallback, state, 5000, true);
        }

        private static void TimeoutCallback(object state, bool timedOut)
        {
            var reqState = (RequestState)state;
            if (timedOut)
            {
                var hashCode = reqState.Request.RequestUri.OriginalString.GetHashCode();
                URLVerifications[hashCode] = "Request timed out.";
                if (reqState.Request != null)
                    reqState.Request.Abort();
            }
        }

        private static void RespCallback(IAsyncResult asynchronousResult)
        {
            ManualResetEvent evt = null;
            int hashCode = 0;
            try
            {
                var reqState = (RequestState)asynchronousResult.AsyncState;
                hashCode = reqState.Request.RequestUri.OriginalString.GetHashCode();
                evt = reqState.Handle;
                reqState.Response = reqState.Request.EndGetResponse(asynchronousResult);
                var resp = ((HttpWebResponse)reqState.Response).StatusCode;
                URLVerifications[hashCode] = resp.ToString();
            }
            catch (WebException e)
            {
                if (hashCode != 0 && string.IsNullOrEmpty((string)URLVerifications[hashCode]))
                    URLVerifications[hashCode] = e.Response == null ? e.Status.ToString() : (int)((HttpWebResponse)e.Response).StatusCode + ": " + ((HttpWebResponse)e.Response).StatusCode;
            }
            finally
            {
                if (evt != null)
                    evt.Set();
            }
        }
    }
}

希望有帮助

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多