সি # কোনও ইউআরএল উপস্থিত / বৈধ কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


117

আমি ভিজ্যুয়াল সি # 2005 এ একটি সাধারণ প্রোগ্রাম তৈরি করছি যা ইয়াহুতে একটি স্টক প্রতীক দেখায়! ফিনান্স, historicalতিহাসিক ডেটা ডাউনলোড করে এবং তারপরে নির্দিষ্ট টিকার প্রতীকটির জন্য দামের ইতিহাস প্লট করে।

আমি সঠিক ইউআরএলটি জানি যা আমার ডেটা অর্জন করতে হবে এবং যদি ব্যবহারকারী একটি বিদ্যমান টিকার প্রতীক (বা ইয়াহু ফিনান্সে ডেটা সহ কমপক্ষে একটি) রাখে তবে এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে। তবে প্রোগ্রামটি অস্তিত্বহীন ওয়েব পৃষ্ঠা থেকে ডেটা টানতে চেষ্টা করার সাথে যদি ব্যবহারকারী একটি টিকার প্রতীক তৈরি করে তবে আমার একটি রান-টাইম ত্রুটি রয়েছে।

আমি ওয়েবক্লিয়েন্ট ক্লাস ব্যবহার করছি এবং ডাউনলোডস্ট্রিং ফাংশনটি ব্যবহার করছি। আমি ওয়েবক্লিয়েন্ট শ্রেণীর অন্যান্য সদস্য ফাংশনটি সন্ধান করেছি, তবে ইউআরএল পরীক্ষা করতে আমি ব্যবহার করতে পারি এমন কিছুই দেখতে পেলাম না।

কিভাবে আমি এটি করতে পারব?


1
সি # 2.0 (VS2005) ব্যবহার দেখানোর জন্য আপডেট হয়েছে
মার্ক গ্রেভেল

উত্তর:


110

আপনি "জিইটি" না দিয়ে "হেড" অনুরোধটি জারি করতে পারেন ?

(সম্পাদনা) - লোল! দেখে মনে হচ্ছে এর আগে আমি এই কাজটি করেছি !; পুনঃ-সংগ্রহের অভিযোগ এড়ানোর জন্য উইকিতে পরিবর্তিত হয়েছে। সুতরাং সামগ্রী ডাউনলোড না করেই কোনও URL পরীক্ষা করতে:

// using MyClient from linked post
using(var client = new MyClient()) {
    client.HeadOnly = true;
    // fine, no content downloaded
    string s1 = client.DownloadString("http://google.com");
    // throws 404
    string s2 = client.DownloadString("http://google.com/silly");
}

আপনি try/ catchচারপাশে DownloadStringত্রুটিগুলি পরীক্ষা করার জন্য; কোন ত্রুটি? এটি বিদ্যমান...


সি # ২.০ (ভিএস ২০০৫) সহ:

private bool headOnly;
public bool HeadOnly {
    get {return headOnly;}
    set {headOnly = value;}
}

এবং

using(WebClient client = new MyClient())
{
    // code as before
}

এফডব্লিউআইডাব্লু - আপনি কেবল এইচটিটিপি পদ্ধতি পরিবর্তন করার কারণে এটি নিশ্চিতভাবেই সমস্যাটি সমাধান করে (সম্ভবত ভিন্ন আচরণের ক্লায়েন্টের পক্ষ ছাড়া অন্য)) সার্ভারের প্রতিক্রিয়া নির্ভরযোগ্যভাবে নির্ভর করবে যে কীভাবে লজিক কোড করা হয়েছে এবং স্টক দামের মতো গতিশীল পরিষেবার জন্য ভাল কাজ করতে পারে না তার উপর। স্ট্যাটিক রিসোর্সের জন্য (যেমন চিত্র, ফাইল ইত্যাদি) হেড সাধারণত সার্ভারে বেকড হওয়ার কারণে বিজ্ঞাপন হিসাবে কাজ করে। সাধারণত সাধারণত পোষ্ট এবং জিইটি-তে ফোকাস থাকায় অনেক প্রোগ্রামার স্পষ্টভাবেই অনুরোধের মুখোমুখি হন না। ওয়াইএমএমভি
ডেভিড টেলর

একটি উত্তর বাছতে এতক্ষণ সময় নেওয়ার জন্য দুঃখিত ... আমি স্কুল এবং কাজের সাথে একপাশে বিভক্ত হয়ে পড়েছিলাম এবং এই পোস্টটি সম্পর্কে একধরণের ভুলে গেছি। সিডনোট হিসাবে, আমি আপনার সমাধানটি বেশ কার্যকরভাবে পেতে পারি নি কারণ আমি ভিজুয়াল স্টুডিও 2005 ব্যবহার করছি যার 'ভার' টাইপ নেই। আমি কয়েক মাস ধরে এই প্রকল্পে কাজ করি নি, তবে সেই সত্যটির কি কোনও সহজ সমাধান আছে? এছাড়াও আমি যখন আপনার সমাধানটি বাস্তবায়নের চেষ্টা করেছি তখন আমার মনে আছে যে 'গেট' এবং 'সেট' সংজ্ঞাগুলিতে কোনও কোডবিহীন HeadOnly সম্পত্তি সংজ্ঞায়িত করার চেষ্টা করার জন্য এটি আমার উপর ক্ষিপ্ত হয়েছিল। অথবা আমি কেবল কিছু ভুল করছি। তবুও সাহায্যের জন্য ধন্যবাদ!
ড্যানিয়েল ওয়াল্ট্রিপ 0

মাইক্রাইয়েন্ট কী ?
কুইকিনেট

@Kiquenet দেহের মধ্যে একটি লিঙ্ক, এখানে হবে: stackoverflow.com/questions/153451/...
মার্ক Gravell

136

এই সমাধানটির আরও একটি বাস্তবায়ন এখানে দেওয়া হল:

using System.Net;

///
/// Checks the file exists or not.
///
/// The URL of the remote file.
/// True : If the file exits, False if file not exists
private bool RemoteFileExists(string url)
{
    try
    {
        //Creating the HttpWebRequest
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        //Setting the Request method HEAD, you can also use GET too.
        request.Method = "HEAD";
        //Getting the Web Response.
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        //Returns TRUE if the Status code == 200
        response.Close();
        return (response.StatusCode == HttpStatusCode.OK);
    }
    catch
    {
        //Any exception will returns false.
        return false;
    }
}

থেকে: http : //www.dotnetالts.net/2009/10/14/how-to-check-remote-file-exists- using-c/


2
একগুচ্ছ চিত্রের উপস্থিতি আছে কিনা তা পরীক্ষা করতে আমি এই কোডটি ব্যবহার করছি এবং এটি বেশ ধীর (ইউআরএল প্রতি কয়েক সেকেন্ড)। কেউ কি জানেন যে এই কোডটি নিয়ে এটি কোনও সমস্যা, বা এই ধরণের কল করার সময় জীবনের একটি সত্য ঘটনা?
স্মিথ

@ এসমিথ আপনি নিজের কোডটি গতিময় করার এক উপায় হ'ল সমান্তরাল চেক করা। ফোর্যাচ লুপ আপনি যদি এখনও চেষ্টা না করে থাকেন। এটি আমার ইউআরএল পরীক্ষার অ্যাপ্লিকেশনটি আরও দ্রুত তৈরি করেছে।
জ্যাক ফেয়ারফিল্ড 21

3
এই স্টাফটি ডিসপোজডবজেক্টকে বিনিময়ে ফেলে দেয় (প্রতিক্রিয়া। স্ট্যাটাসকোড == এইচটিটিপিস্ট্যাটাসকোড.ওকে); ব্যবহারে মোড়ানো
Lapenkov ভ্লাদিমির

1
উপরের কোড সহ একটি সমস্যা আছে। যদি আপনি প্রতিক্রিয়া করেন lo বন্ধ (); তারপরে আপনি প্রতিক্রিয়া যাচাই করতে পারবেন না at স্ট্যাটাসকোড বন্ধ হওয়ায় এটি একটি ব্যতিক্রম ছুঁড়ে দেবে।
রেনাসেন্ট

@ এসএসএম খুব দ্রুত কোন পদ্ধতি?
কুইকিনেট

36

এই সমাধানগুলি বেশ ভাল, তবে তারা ভুলে যাচ্ছেন যে 200 ওকে ছাড়াও অন্য স্থিতি কোড থাকতে পারে। এটি এমন একটি সমাধান যা আমি পরিস্থিতি পর্যবেক্ষণ এবং এর জন্য উত্পাদন পরিবেশে ব্যবহার করেছি।

লক্ষ্য পৃষ্ঠায় যদি কোনও ইউআরএল পুনর্নির্দেশ বা অন্য কোনও শর্ত থাকে তবে এই পদ্ধতিটি ব্যবহার করে রিটার্নটি সত্য হবে। এছাড়াও, getResponse () একটি ব্যতিক্রম ছুঁড়ে ফেলবে এবং তাই আপনি এর জন্য একটি স্ট্যাটাস কোড পাবেন না। আপনাকে ব্যতিক্রম ফাঁদে ফেলতে হবে এবং একটি প্রোটোকলআরারের জন্য পরীক্ষা করতে হবে।

যে কোনও 400 বা 500 স্থিতি কোড মিথ্যা ফিরে আসবে। অন্য সমস্ত সত্য ফিরে। নির্দিষ্ট কোডের কোডগুলির জন্য আপনার প্রয়োজন অনুসারে এই কোডটি সহজেই সংশোধিত করা হয়।

/// <summary>
/// This method will check a url to see that it does not return server or protocol errors
/// </summary>
/// <param name="url">The path to check</param>
/// <returns></returns>
public bool UrlIsValid(string url)
{
    try
    {
        HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
        request.Timeout = 5000; //set the timeout to 5 seconds to keep the user from waiting too long for the page to load
        request.Method = "HEAD"; //Get only the header information -- no need to download any content

        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            int statusCode = (int)response.StatusCode;
            if (statusCode >= 100 && statusCode < 400) //Good requests
            {
                return true;
            }
            else if (statusCode >= 500 && statusCode <= 510) //Server Errors
            {
                //log.Warn(String.Format("The remote server has thrown an internal error. Url is not valid: {0}", url));
                Debug.WriteLine(String.Format("The remote server has thrown an internal error. Url is not valid: {0}", url));
                return false;
            }
        }
    }
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.ProtocolError) //400 errors
        {
            return false;
        }
        else
        {
            log.Warn(String.Format("Unhandled status [{0}] returned for url: {1}", ex.Status, url), ex);
        }
    }
    catch (Exception ex)
    {
        log.Error(String.Format("Could not test url {0}.", url), ex);
    }
    return false;
}

1
আমি যুক্ত করব যে 3xx পরিসরে কিছু স্থিতি কোডগুলি আসলে একটি ত্রুটির কারণ হতে পারে যেমন 304 পরিবর্তিত নয় কোন ক্ষেত্রে আপনি আপনার ক্যাচ ব্লকে যে বিষয়টি পরিচালনা করছেন
রবিভি

3
এই পদ্ধতির সাথে স্রেফ আপনার চুল কাটা সমস্যাটি দেখেছেন: অন্য কিছু ডাউনলোড করার চেষ্টা করার আগে আপনি HttpWebRequestযদি বিষয়টি না .Close()করেন তবে এটি পছন্দ করবেন না response। এটি খুঁজে পেতে ঘন্টা সময় নিয়েছে!
jbeldock

4
HttpWebResponseবস্তুর মধ্যে লেখা হবে usingব্লক এটা কার্যকরী যেহেতু IDisposableযা সংযোগ বন্ধের নিশ্চিত করবে। @ Jbeldock এর মুখোমুখি হওয়ায় এটি সমস্যার কারণ হতে পারে।
হাবিব

2
এটি ইউআরএলগুলিতে 404 নট ফাউন্ডেশন নিক্ষেপ করছে যা ব্রাউজারে দুর্দান্ত কাজ করে ...?
মাইকেল ট্রানকিডা

আপনি যখন এমন কোনও পদ্ধতি সমর্থন করেন না যা সমর্থিত নয় তখন @ মিশেলট্রাঞ্চিদা ওয়েব সার্ভারগুলি 404 এর জন্য কুখ্যাতভাবে পরিচিত। আপনার ক্ষেত্রে Headসেই সংস্থানটিতে সমর্থিত নাও হতে Getপারে be পরিবর্তে এটি 405 নিক্ষেপ করা উচিত ছিল।
শ্রীরাম সাক্তিভেল

9

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি আপনার ইউআরএল পরীক্ষার ফলাফল দিতে আপনি এই জাতীয় একটি ছোট পদ্ধতি ব্যবহার করতে পারেন:

WebRequest webRequest = WebRequest.Create(url);  
WebResponse webResponse;
try 
{
  webResponse = webRequest.GetResponse();
}
catch //If exception thrown then couldn't get response from address
{
  return 0;
} 
return 1;

আপনি কোনও পদ্ধতিতে উপরের কোডটি মোড়ানো করতে পারেন এবং বৈধতা সম্পাদন করতে এটি ব্যবহার করতে পারেন। আমি আশা করি আপনি যে প্রশ্নটি জিজ্ঞাসা করেছেন এটি উত্তর পেয়েছে।


1
হ্যাঁ, সম্ভবত আপনি বিভিন্ন কেসের মধ্যে পার্থক্য দেখিয়ে সমাধানটি পরিমার্জন করতে পারেন (টিসিপি সংযোগ ব্যর্থতা - হোস্ট সংযোগ প্রত্যাখ্যান করেছে, 5xx - মারাত্মক কিছু ঘটেছে, 404 - উত্স পাওয়া যায়নি ইত্যাদি)। ওয়েবএক্সেপশনের স্থিতি সম্পত্তিটি দেখুন;)
ডেভিড টেলর

ডেভিড খুব ভাল পয়েন্ট! এটি আমাদের আরও বিশদ প্রতিক্রিয়া জানায় যাতে আমরা ত্রুটিটি আরও উদ্বেগজনকভাবে পরিচালনা করতে পারি।
ক্যালেন্ডার সফ্টওয়্যার

1
ধন্যবাদ। আমার বক্তব্যটি হ'ল এই পেঁয়াজের কয়েকটি স্তর রয়েছে যার মধ্যে প্রতিটি কাজগুলিতে একটি রেঞ্চ ফেলে দিতে পারে (। নেট ফ্রেমওয়ার্ক, ডিএনএস রেজোলিউশন, টিসিপি কানেক্টিভিটি, টার্গেট ওয়েব সার্ভার, টার্গেট অ্যাপ্লিকেশন ইত্যাদি)। আইএমএইচও একটি ভাল ডিজাইনের তথ্যমূলক প্রতিক্রিয়া এবং ব্যবহারযোগ্য ডায়াগনস্টিকগুলি সরবরাহ করতে বিভিন্ন ব্যর্থতার শর্তগুলির মধ্যে পার্থক্য করতে সক্ষম হওয়া উচিত। কোনও কারণে HTTP এর স্থিতি কোড রয়েছে তাও ভুলে যাবেন না;)
ডেভিড টেলর

6

এটি ব্যবহার করে দেখুন (নিশ্চিত করুন যে আপনি System.Net ব্যবহার করেছেন):

public bool checkWebsite(string URL) {
   try {
      WebClient wc = new WebClient();
      string HTMLSource = wc.DownloadString(URL);
      return true;
   }
   catch (Exception) {
      return false;
   }
}

যখন চেক ওয়েবেসাইট () ফাংশনটি কল হয়ে যায়, এটি URL এর উত্স কোডটি এতে প্রবেশ করার চেষ্টা করে। যদি এটি উত্স কোড পায় তবে এটি সত্য ফিরে আসে। যদি তা না হয় তবে এটি মিথ্যা প্রত্যাবর্তন করে।

কোড উদাহরণ:

//The checkWebsite command will return true:
bool websiteExists = this.checkWebsite("https://www.google.com");

//The checkWebsite command will return false:
bool websiteExists = this.checkWebsite("https://www.thisisnotarealwebsite.com/fakepage.html");

3

এখানে আরও একটি বিকল্প রয়েছে

public static bool UrlIsValid(string url)
{
    bool br = false;
    try {
        IPHostEntry ipHost = Dns.Resolve(url);
        br = true;
    }
    catch (SocketException se) {
        br = false;
    }
    return br;
}

3
হোস্টের উপস্থিতি আছে কিনা তা যাচাই করার জন্য এটি কার্যকর হতে পারে। হোস্টের উপস্থিতি আছে কি নেই তা নিয়ে প্রশ্নটি স্পষ্টতই উদ্বিগ্ন নয়। হোস্টের উপস্থিতি রয়েছে এবং ঠিক আছে বলে জানা যায় এটি একটি খারাপ এইচটিটিপি পথ পরিচালনা করার সাথে সম্পর্কিত ।
বিনকি

3

এই সমাধানটি অনুসরণ করা সহজ বলে মনে হচ্ছে:

public static bool isValidURL(string url) {
    WebRequest webRequest = WebRequest.Create(url);
    WebResponse webResponse;
    try
    {
        webResponse = webRequest.GetResponse();
    }
    catch //If exception thrown then couldn't get response from address
    {
        return false ;
    }
    return true ;
}

1
ওয়েব রেসপন্স বন্ধ করতে ভুলবেন না, অন্যথায় আপনি যখন আপনার পদ্ধতিটি কল করবেন তখন প্রতিক্রিয়া সময় বাড়বে
মাদাগাগা

3
WebRequest request = WebRequest.Create("http://www.google.com");
try
{
     request.GetResponse();
}
catch //If exception thrown then couldn't get response from address
{
     MessageBox.Show("The URL is incorrect");`
}

1
আপনার উত্তরে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন। কোড-কেবলমাত্র উত্তরগুলি বিভ্রান্তিকর এবং ভবিষ্যতের পাঠকদের জন্য সহায়ক নয় এবং এভাবে ডাউনভোটকে আকর্ষণ করতে পারে।
জেসি

2

আমার কাছে ইউআরএলটি বৈধ কিনা তা নির্ধারণের আরও সহজ উপায়।

if (Uri.IsWellFormedUriString(uriString, UriKind.RelativeOrAbsolute))
{
   //...
}

4
না, এই পদ্ধতিটি ইউআরএলটি সত্যিই অ্যাক্সেসযোগ্য কিনা তা পরীক্ষা করে না। এমনকি এমনকি সত্য ফিরে আসে যখন ইউরি.আইসওয়েলফর্মডউরিস্ট্রিং (" 192.168.1.421 ", ...), যা স্পষ্টতই ভুল ইউআরএল ব্যবহার করে
ঝাওরফেই

2

আমি সর্বদা খুঁজে পেয়েছি ব্যতিক্রমগুলি পরিচালনা করতে অনেক ধীর।

সম্ভবত একটি নিবিড় উপায় কি আরও ভাল, দ্রুত, ফলাফল ছাঁটাই করবে?

public bool IsValidUri(Uri uri)
{

    using (HttpClient Client = new HttpClient())
    {

    HttpResponseMessage result = Client.GetAsync(uri).Result;
    HttpStatusCode StatusCode = result.StatusCode;

    switch (StatusCode)
    {

        case HttpStatusCode.Accepted:
            return true;
        case HttpStatusCode.OK:
            return true;
         default:
            return false;
        }
    }
}

তারপরে কেবল ব্যবহার করুন:

IsValidUri(new Uri("http://www.google.com/censorship_algorithm"));

1

ওয়েব সার্ভারগুলি এইচটিটিপি স্থিতি কোডের সাথে অনুরোধের ফলাফল হিসাবে নির্দেশ করে যেমন 200 (কখনও কখনও 202) মানে সাফল্য, 404 - পাওয়া যায় না ইত্যাদি ( এখানে দেখুন) )। ইউআরএলটির সার্ভার ঠিকানার অংশটি সঠিক এবং আপনি কোনও সকেটের সময়সীমা পেয়েছেন না, ব্যতিক্রমটি সম্ভবত আপনাকে এইচটিটিপি স্থিতির কোডটি 200 এর বাইরে বলে দিচ্ছে I আমি ব্যতিক্রমের শ্রেণিটি পরীক্ষা করার এবং ব্যতিক্রমটি বহন করে কিনা তা দেখার পরামর্শ দিচ্ছি I HTTP স্থিতি কোড।

আইআইআরসি - প্রশ্নযুক্ত কলটি একটি ওয়েবএক্সেপশন বা বংশধরকে ছুড়ে ফেলে। শর্তটি ফাঁদে ফেলার জন্য কোনটি দেখতে ক্লাসের নামটি পরীক্ষা করে দেখুন এবং কলটি কোনও চেষ্টা ব্লকে মোড়ক করুন।


2
প্রকৃতপক্ষে, 200-299 ব্যাপ্তির কোনও কিছুর অর্থ সাফল্য, আইআইআরসি
মার্ক গ্র্যাভেল

মার্ক, আপনি একেবারে সঠিক। আমি ইচ্ছাকৃতভাবে "ক্লাসের ত্রুটি" ধারণাটি (যেমন 5XX, 4XX, 3xx, 2XX ইত্যাদি) এড়ানো এড়াতেছি যেহেতু এটি পোকার পুরোপুরি ক্যান খুলে দেয়। এমনকি মানক কোডগুলি হ্যান্ডল করা (200, 302, 404, 500 ইত্যাদি) পুরোপুরি কোডগুলি উপেক্ষা করার চেয়ে অনেক ভাল।
ডেভিড টেলর

1

ইতিমধ্যে প্রদত্ত উদাহরণগুলি অনুসরণ করে, আমি বলব, এটির মতো ব্যবহার করে প্রতিক্রিয়াটি মোড়ানো সর্বোত্তম অনুশীলন

    public bool IsValidUrl(string url)
    {
         try
         {
             var request = WebRequest.Create(url);
             request.Timeout = 5000;
             request.Method = "HEAD";

             using (var response = (HttpWebResponse)request.GetResponse())
             {
                response.Close();
                return response.StatusCode == HttpStatusCode.OK;
            }
        }
        catch (Exception exception)
        { 
            return false;
        }
   }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.