2016-12-31 4 views
0

例外はほとんどの場合起こりますが、うまくいきます。どのように処理できますか、例外を処理する方法リモートサーバーからエラーが返されました:(500)内部サーバーエラー?

例外は常に同じ

The remote server returned an error: (500) Internal Server Error.

でもスタックトレースが同じである:

at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
at System.Net.WebClient.DownloadData(Uri address)
at System.Net.WebClient.DownloadData(String address)
at SatelliteImages.ExtractImages.ExtractDateAndTime(String baseAddress) in D:\C-Sharp\SatelliteImages\SatelliteImages\SatelliteImages\ExtractImages.cs:line 120

ライン120である。

var temp = wc.DownloadData("/en"); 

方法:

public void ExtractDateAndTime(string baseAddress) 
{ 
    try 
    { 
     var wc = new WebClient(); 
     wc.BaseAddress = baseAddress; 

     HtmlDocument doc = new HtmlDocument(); 

     var temp = wc.DownloadData("/en"); 
     doc.Load(new MemoryStream(temp)); 

     var secTokenScript = doc.DocumentNode.Descendants() 
        .Where(e => 
          String.Compare(e.Name, "script", true) == 0 && 
          String.Compare(e.ParentNode.Name, "div", true) == 0 && 
          e.InnerText.Length > 0 && 
          e.InnerText.Trim().StartsWith("var region") 
         ).FirstOrDefault().InnerText; 

     var securityToken = secTokenScript; 
     securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push")); 
     securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", ""); 

     var dates = securityToken.Trim().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); 
     var scriptDates = dates.Select(x => new ScriptDate { DateString = x }); 

     foreach (var date in scriptDates) 
     { 
      DatesAndTimes.Add(date.DateString); 
     } 
    } 
    catch(WebException wex) 
    { 
     if (wex.Response != null) 
     { 
      using (var errorResponse = (HttpWebResponse)wex.Response) 
      { 
       using (var reader = new StreamReader(errorResponse.GetResponseStream())) 
       { 
        string error = reader.ReadToEnd(); 
       } 
      } 
     } 

     countriescodes = new List<string>(); 
     countriesnames = new List<string>(); 
     DatesAndTimes = new List<string>(); 
     imagesUrls = new List<string>(); 

     this.Init(); 
    } 
} 

私は行にブレークポイントを使用する場合:

string error = reader.ReadToEnd(); 

を私はHTMLコンテンツを参照し、コンテンツに、私はテキストを参照してください。例外が発生したとき

error occurred while processing your request. Return to the homepage of Sat24.com

私が何をしたいのかが何らかの形でありますもう一度やり直して、ダウンロードを試みてくださいExtractDateAndTimeメソッドを試してください。

私はタイマーを使って30秒くらい何かを見せて、もう一度試してみると思います。サーバーのサイトで30秒間スパム/フラッディングと見なされますか?

これは完全なクラスのコードですが、例外はこのメソッドExtractDateAndTimeです。私が欲しいもの

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Net; 
using System.Xml; 
using HtmlAgilityPack; 
using System.ComponentModel; 

namespace SatelliteImages 
{ 
    class ExtractImages 
    { 
     static WebClient client; 
     static string htmltoextract; 
     public static List<string> countriescodes = new List<string>(); 
     public static List<string> countriesnames = new List<string>(); 
     public static List<string> DatesAndTimes = new List<string>(); 
     public static List<string> imagesUrls = new List<string>(); 
     static string firstUrlPart = "http://www.sat24.com/image2.ashx?region="; 
     static string secondUrlPart = "&time="; 
     static string thirdUrlPart = "&ir="; 

     public class ProgressEventArgs : EventArgs 
     { 
      public int Percentage { get; set; } 
      public string StateText { get; set; } 
     } 

     public event EventHandler<ProgressEventArgs> ProgressChanged; 

     public void Init() 
     { 
      object obj = null; 
      int index = 0; 

      ExtractCountires(); 

      foreach (string cc in countriescodes) 
      { 
       // raise event here 
       ProgressChanged?.Invoke(obj,new ProgressEventArgs{ Percentage = 100 * index/countriescodes.Count, StateText = cc }); 
       ExtractDateAndTime("http://www.sat24.com/image2.ashx?region=" + cc); 
       index +=1; 
      } 

      ImagesLinks(); 
     } 

     public void ExtractCountires() 
     { 
      try 
      { 
       htmltoextract = "http://sat24.com/en/?ir=true";//"http://sat24.com/en/";// + regions; 
       client = new WebClient(); 
       client.DownloadFile(htmltoextract, @"c:\temp\sat24.html"); 
       client.Dispose(); 

       string tag1 = "<li><a href=\"/en/"; 
       string tag2 = "</a></li>"; 

       string s = System.IO.File.ReadAllText(@"c:\temp\sat24.html"); 
       s = s.Substring(s.IndexOf(tag1)); 
       s = s.Substring(0, s.LastIndexOf(tag2) + tag2.ToCharArray().Length); 
       s = s.Replace("\r", "").Replace("\n", "").Replace(" ", ""); 

       string[] parts = s.Split(new string[] { tag1, tag2 }, StringSplitOptions.RemoveEmptyEntries); 

       string tag3 = "<li><ahref=\"/en/"; 

       for (int i = 0; i < parts.Length; i++) 
       { 
        if (i == 17) 
        { 
         //break; 
        } 

        string l = ""; 

        if (parts[i].Contains(tag3)) 
         l = parts[i].Replace(tag3, ""); 

        string z1 = l.Substring(0, l.IndexOf('"')); 

        if (z1.Contains("</ul></li><liclass=")) 
        { 
         z1 = z1.Replace("</ul></li><liclass=", "af"); 
        } 

        countriescodes.Add(z1); 
        countriescodes.GroupBy(n => n).Any(c => c.Count() > 1); 

        string z2 = parts[i].Substring(parts[i].LastIndexOf('>') + 1); 

        if (z2.Contains("&amp;")) 
        { 
         z2 = z2.Replace("&amp;", " & "); 
        } 

        countriesnames.Add(z2); 
        countriesnames.GroupBy(n => n).Any(c => c.Count() > 1); 
       } 
      } 
      catch (Exception e) 
      { 
       if (countriescodes.Count == 0) 
       { 
        countriescodes = new List<string>(); 
        countriesnames = new List<string>(); 
        DatesAndTimes = new List<string>(); 
        imagesUrls = new List<string>(); 
        Init(); 
       } 
      } 
     } 

     public void ExtractDateAndTime(string baseAddress) 
     { 
      try 
      { 
       var wc = new WebClient(); 
       wc.BaseAddress = baseAddress; 
       HtmlDocument doc = new HtmlDocument(); 

       var temp = wc.DownloadData("/en"); 
       doc.Load(new MemoryStream(temp)); 

       var secTokenScript = doc.DocumentNode.Descendants() 
        .Where(e => 
          String.Compare(e.Name, "script", true) == 0 && 
          String.Compare(e.ParentNode.Name, "div", true) == 0 && 
          e.InnerText.Length > 0 && 
          e.InnerText.Trim().StartsWith("var region") 
         ).FirstOrDefault().InnerText; 
       var securityToken = secTokenScript; 
       securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push")); 
       securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", ""); 
       var dates = securityToken.Trim().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); 
       var scriptDates = dates.Select(x => new ScriptDate { DateString = x }); 
       foreach (var date in scriptDates) 
       { 
        DatesAndTimes.Add(date.DateString); 
       } 
      } 
      catch(WebException wex) 
      { 
       if (wex.Response != null) 
       { 
        using (var errorResponse = (HttpWebResponse)wex.Response) 
        { 
         using (var reader = new StreamReader(errorResponse.GetResponseStream())) 
         { 
          string error = reader.ReadToEnd(); 
         } 
        } 
       } 

          countriescodes = new List<string>(); 
       countriesnames = new List<string>(); 
       DatesAndTimes = new List<string>(); 
       imagesUrls = new List<string>(); 
       this.Init(); 
      } 
     } 

     public class ScriptDate 
     { 
      public string DateString { get; set; } 
      public int Year 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(0, 4)); 
       } 
      } 
      public int Month 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(4, 2)); 
       } 
      } 
      public int Day 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(6, 2)); 
       } 
      } 
      public int Hours 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(8, 2)); 
       } 
      } 
      public int Minutes 
      { 
       get 
       { 
        return Convert.ToInt32(this.DateString.Substring(10, 2)); 
       } 
      } 
     } 

     public void ImagesLinks() 
     { 
      int cnt = 0; 
      foreach (string countryCode in countriescodes) 
      { 
       cnt++; 
       for (; cnt < DatesAndTimes.Count(); cnt++) 
       { 
        string imageUrl = firstUrlPart + countryCode + secondUrlPart + DatesAndTimes[cnt] + thirdUrlPart + "true"; 
        imagesUrls.Add(imageUrl); 
        if (cnt % 10 == 0) break; 
       } 
      } 
     } 
    } 
} 

は、例外の場合には、最初からやり直し、再びクラス全体の動作を超えるきれいに起こるです。 Form1ので

私はかつて級動作を初めて起動します。トップに :

ExtractImages ei = new ExtractImages(); 

次に、コンストラクタで:

ei.Init(); 

問題が時々起こることを、この例外です。

答えて

0

PollyまたはTransient Fault Handling Application Blockのようなコードで再試行戦略を適用できます。

どちらのパッケージも、さまざまなシナリオですぐに使用できる複数のコンポーネントを提供しており、いつでも自分自身を開発することができます。含ま再試行政策のいくつか:

  • インクリメンタル
  • 一定間隔
  • 指数バックオフ
  • 再試行
  • これまで
  • 再試行のための再試行と
  • 待ちを待って永遠にリトライ
  • ...
関連する問題