0

サーバーへの HttpWebRequest を形成しようとしています。使用しているユーザー名とパスワードをテストしたところ、対象の Web サイトのログイン フォームを使用して正しく認証されました。

HttpWebRequest に関連する 403 に関する Stack の他のすべての投稿を調べて読み、有効なユーザー エージェント、Accept フィールド、および ContentType を持つようにコードを更新しました。前の 3 つの属性のうちの 1 つが欠けていることが、人々が犯す最も一般的な間違いのようです。

私のコードは以下で、「Response Created The remote server returned an error: (403) Forbidden.」と表示されます。

{
    HttpWebRequest request = buildRequest(url);        
    print("Response Created");
    try
    {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            //Do stuff with the response
        }
    }
    catch (Exception ex)
    {
        print(ex.Message);
    }
    Done.Visible = true;
}

private HttpWebRequest buildRequest(String url)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    //I also tried authenticating in the header with no luck.
    //byte[] authBytes = Encoding.UTF8.GetBytes("username:password".ToCharArray());
    //req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);
    req.Method = "GET";
    req.Credentials = new NetworkCredential("username","password");
    req.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27";
    req.PreAuthenticate = true;
    req.Accept = "application/json";
    req.ContentType = "application/json; charset=utf-8";
    req.KeepAlive = true;
    return req;
}

ご協力いただきありがとうございます。

4

2 に答える 2

0

System.Net.CookieContainer後続の呼び出しで Cookie を受信して​​設定するには、a を使用します。プロパティは、CookieContainerさまざまなリクエスト間でステートフルです。

これがMSDNのドキュメントです。

public SomeClass 
{
    var _cookies = new CookieContainer();

    private HttpWebRequest buildRequest(String url)  
    {  
       HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);  
       req.CookieContainer = _cookies;
       // omitted rest of code
    }

}
于 2012-07-31T18:50:50.873 に答える
0

Web サイトがログイン時に POST メソッドを使用していないことを確認してください。そうでない場合は、この回答を無視してください。

データを送信するときに Web サイトが POST メソッドを使用する場合、送信する前にリクエストの最後にデータを追加する必要があります (これは Fiddler で簡単に確認できます)。

string postDataString = "foo1=bar1&foo2=bar2&foo3=bar3";
//Use whatever encoding is appropriate for the submission
byte[] postData = Encoding.ASCII.GetBytes(postDataString);


//When building your request, set the ContentLength property and append the data
req.ContentLength = postData.Length;

using (Stream dataStream = req.GetRequestStream())
{
    dataStream.Write(postData, 0, postData.Length);
}
于 2012-07-31T19:17:16.563 に答える