基本認証を使用した Webclient / HttpWebRequest は、有効な URL に対して 404 が見つかりません 質問する

基本認証を使用した Webclient / HttpWebRequest は、有効な URL に対して 404 が見つかりません 質問する

編集: 問題は私の側ではなく、むしろ相手側のコードにあったことを指摘しておきたいと思います。

基本認証を使用してページを表示しようとしています。404 ページが見つかりませんというエラーが繰り返し表示されます。URL をコピーしてブラウザに貼り付けると、問題なく動作します (サイトにまだログインしていない場合は、認証ボックスが表示され、ログインしていない場合は、開きたいページが開きます)。間違ったユーザー名/パスワードを意図的に入力すると 401 (認証されていないエラー) が表示され、クエリ文字列に間違ったパラメータを渡すと内部サーバー エラー 500 が表示されるので、正しい場所にアクセスして認証しているに違いありません。Webclient と HttpWebRequest の両方を使用してみましたが、どちらも同じ 404 ページが見つかりませんというエラーが表示されます。

Webクライアントの場合:

string url = "MyValidURLwithQueryString";
WebClient client = new WebClient();
String userName = "myusername";
String passWord = "mypassword";
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(userName + ":" + passWord));
client.Headers[HttpRequestHeader.Authorization] = "Basic " + credentials;
var result = client.DownloadString(url);
Response.Write(result);

HttpWebRequestを使用する場合

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("MyValidURL");
string authInfo = "username:password";
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
request.Headers.Add("Authorization", "Basic " + authInfo);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Http.Get;
request.AllowAutoRedirect = true;
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader streamreader = new StreamReader(stream);
string s = streamreader.ReadToEnd();
Response.Write(s);

ベストアンサー1

//BEWARE
//This works ONLY if the server returns 401 first
//The client DOES NOT send credentials on first request
//ONLY after a 401
client.Credentials = new NetworkCredential(userName, passWord); //doesnt work

//So use THIS instead to send credentials RIGHT AWAY
string credentials = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(userName + ":" + password));
client.Headers[HttpRequestHeader.Authorization] = string.Format(
    "Basic {0}", credentials);

おすすめ記事