2016-06-13 5 views
0

私は、ユーザーがWebサイトのfaviconを表示しようとすると、プログラムが応答するURLを入力できるツールを作成しています。私はこれを多くのサイトで動作させていますが、私に問題を起こしているサイトは自分のホストしているTracサイトです。 Tracの通常の動作は、エンドユーザがautenticatedされるまで、カスタム403ページ(禁止されている)を表示してログインを促すように思われます。WebブラウザからTracにアクセスすると、ブラウザのタブにFaviconが表示されます。ログインしていません(Firebugの場合は、ページの内容が403です)。私がブラウザーからソースを見ると、ファビコンの場所がソースにあります。しかし、私のアプリケーションから、request.GetResponse()でTracのWebサイトに403を含むWebExceptionを要求すると、faviconの検索に必要な重要な情報を含む応答ストリームを読む機会がありません。403ページからfaviconを取得する方法

私はすでにウェブサイトのHTMLをダウンロードし、そのファビコンの場所を抽出するコードを持っています。私はと立ち往生していますと、それは私がHttpWebRequestオブジェクトの様々なUserAgentAcceptAcceptLanguageプロパティでプレイ403

で応答しますが、それは助けにはならなかった場合でも、サイトのHTMLをダウンロードすることです。私はまた、リダイレクトを自分自身でやってみました。まだ運がありません。

は、ここで私が持っているものです。

public static MemoryStream DownloadHtml(
     string urlParam, 
     int timeoutMs = DefaultHttpRequestTimeoutMs, 
     string userAgent = "", 
     bool silent = false 
) 
{ 
    MemoryStream result = null; 

    HttpWebRequest request = null; 
    HttpWebResponse response = null; 

    try 
    { 
     Func<string, HttpWebRequest> createRequest = (urlForFunc) => 
     { 
      var requestForAction = (HttpWebRequest)HttpWebRequest.Create(urlForFunc); 

      // This step is now required by Wikipedia (and others?) to prevent periodic or 
      // even constant 403's (Forbidden). 
      requestForAction.UserAgent = userAgent; 

      requestForAction.Accept = "text/html"; 
      requestForAction.AllowAutoRedirect = false; 
      requestForAction.Timeout = timeoutMs; 

      return requestForAction; 
     }; 

     string urlFromResponse = ""; 
     string urlForRequest = ""; 

     do 
     { 
      if(response == null) 
      { 
       urlForRequest = urlParam; 
      } 
      else 
      { 
       urlForRequest = urlFromResponse; 

       response.Close(); 
      } 

      request = createRequest(urlForRequest); 
      response = (HttpWebResponse)request.GetResponse(); 

      urlFromResponse = response.Headers[HttpResponseHeader.Location]; 
     } 
     while(urlFromResponse != null 
       && urlFromResponse.Length > 0 
       && urlFromResponse != urlForRequest); 

     using(var stream = response.GetResponseStream()) 
     { 
      result = new MemoryStream(); 
      stream.CopyTo(result); 
     } 
    } 
    catch(WebException ex) 
    { 
     // Things like 404 and, well, all other web-type exceptions. 

     Debug.WriteLine(ex.Message); 
     if(ex.InnerException != null) Debug.WriteLine(ex.InnerException.Message); 
    } 
    catch(System.Threading.ThreadAbortException) 
    { 
     // Let ac.Thread handle some cleanup. 
     throw; 
    } 
    catch(Exception) 
    { 
     if(!silent) throw; 
    } 
    finally 
    { 
     if(response != null) response.Close(); 
    } 

    return result; 
} 

答えて

1

ストリームコンテンツは、Exceptionオブジェクトに格納されています。

var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); 
+0

例外として、撃つ!ドキュメントを含めて私が見なかった1つの場所。ありがとうございました! –

関連する問題