2016-07-12 30 views
3

ウェブサイトからxmlファイルを受信/復号するためのXMLグラバーを作成しました。これは、主に正常に動作しますが、それは常にエラーを返す:HttpWebRequestは "(403)Forbidden"エラーを返します。

"The remote server returned an error: (403) Forbidden."

サイトhttp://w1.weather.gov/xml/current_obs/KSRQ.xml

のために私のコードは次のとおりです。

CookieContainer cookies = new CookieContainer(); 
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(Path); 
webRequest.Method = "GET"; 
webRequest.CookieContainer = cookies; 
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) 
{ 
    using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream())) 
    { 
     string xml = streamReader.ReadToEnd(); 
     xmldoc.LoadXml(xml); 
    } 
} 

と例外がのGetResponseメソッドでスローです。何が起こったのかを知るにはどうすればいいですか?

+0

を使用すると、デバッガを使用してい..?あなたの2行目のコードで 'webRequest'はどうなるでしょうか?あなたが 'ReadToEnd();'メソッドを実行しているとき、XMLはどのように見えるのですか? '88' upvotesで答えを見てください。http://stackoverflow.com/questions/7543324/how-to-convert-webresponse-getresponsestream-return-into-a-string – MethodMan

+0

@MethodMan - 最後の行に基づいていますコードがこれほど遠くになっているとは思わない。 'GetResponse()'メソッドの最初の 'using'ブロックで失敗します。 – Igor

+0

>リクエストxml>拡張子はxml> HTMLを取得します>政府 – Will

答えて

8

あなたのリクエストには、サーバーが必要とするヘッダーがない可能性があります。私はブラウザでページをリクエストし、Fiddlerを使って正確なリクエストを記録してから、User-Agentヘッダーを削除してリクエストを再発行しました。これは403の応答をもたらした。

この頻繁にあなたがやっているだけのように自分のサイトのスクリプトを防止するための試みで、サーバーによって使用される; O)

この場合、403応答でのサーバーヘッダーは、エッジを示す「AkamaiGHost」でありますAkamaiのクラウドセキュリティソリューションのノード。おそらくボットを防御するWAFルールが403をトリガしています。

このサイトではUser-Agentヘッダーに値を追加するようです。たとえば、私はそれを「間違いなくスクリーンスクレーパー」に設定しています。それはうまくいくようです。

この種の問題が発生した場合、ブラウザツールやFiddlerのようなプロキシを使用して、実際のHTTPリクエストとレスポンスを調べることが非常に役立ちます。スコットHanselman氏が言うように

The internet is not a black box

http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx

+1

私は同意する、これはおそらく原因だろう。 @ncite - これを参照してください前のSO答え[C#で認証なしでWebAp2を消費する方法](http://stackoverflow.com/a/38316025/1260204)私はまったく同じ問題を抱えていた昨日書いて、ユーザ - エージェントヘッダ。 – Igor

+0

ありがとう! Mike Goodwinと@Igorの両方。 – ncite

0

リクエストはプロキシサーバー経由ですか?はいの場合は、GetResponse()コールの前に次の行を追加します。

webRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
0

ほとんどの場合、アクセスしようとしているリソースにアクセスする権限がありません。したがって、必要なアクションを完了するために必要な資格情報を取得する必要があります。

6

明らかに、URLはブラウザから機能します。コードからはうまくいきません。おそらく、クローラを防ぐための非常に基本的な方法として、サーバーがユーザーエージェントに基づいた要求を受け入れ/拒否しているように見えます。動作するようには思えない

webRequest.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"; 

を介して取得するには、ちょうどそれは、例えば、認識して何かにUserAgentプロパティを設定します。