C#でHttpWebResponseオブジェクトから完全な応答を生成しない
-
03-07-2019 - |
質問
別のaspxページからHttpWebRequestオブジェクトを作成して、応答ストリームをデータストアに保存しています。 HttpWebRequestオブジェクトの作成に使用しているURLには、正しい出力をレンダリングするクエリ文字列が含まれています。古いブラウザを使用してページを参照すると、正しくレンダリングされます。 HttpWebResponse.GetResponseStream()を使用して出力ストリームを取得しようとすると、組み込みのエラーチェックがレンダリングされます。
ブラウザで正しくレンダリングするのに、HttpWebRequestオブジェクトとHttpWebResponseオブジェクトを使用しないのはなぜですか?
ソースコードは次のとおりです。
ターゲットページのコードビハインド:
protected void PageLoad(object sender, EventsArgs e)
{
string output = string.Empty;
if(Request.Querystring["a"] != null)
{
//generate output
output = "The query string value is " + Request.QueryString["a"].ToString();
}
else
{
//generate message indicating the query string variable is missing
output = "The query string value was not found";
}
Response.Write(output);
}
HttpWebRequestオブジェクトを作成するページのコードビハインド
string url = "http://www.mysite.com/mypage.aspx?a=1";
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url)
//this if statement was missing from original example
if(User.Length > 0)
{
request.Credentials = new NetworkCredentials("myaccount", "mypassword", "mydomain");
request.PreAuthenticate = true;
}
request.UserAgent = Request.UserAgent;
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
Stream resStream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(resStream, encode, true, 2000);
int count = readStream.Read(read, 0, read.Length);
string str = Server.HtmlEncode(" ");
while (count > 0)
{
// Dumps the 256 characters on a string and displays the string to the console.
string strRead = new string(read, 0, count);
str = str.Replace(str, str + Server.HtmlEncode(strRead.ToString()));
count = readStream.Read(read, 0, 256);
}
// return what was found
result = str.ToString();
resStream.Close();
readStream.Close();
更新
@David McEwing-完全なページ名でHttpWebRequestを作成しています。ページはまだエラー出力を生成しています。ターゲットページのコードサンプルを更新して、私がやっていることを正確に示しました。
@Chris Lively-エラーページにリダイレクトしていません。クエリ文字列値が見つからなかったことを示すメッセージを生成します。ソースコードの例を更新しました。
更新1:
Fiddlerを使用してHttpWebRequestをトレースしようとしましたが、Webセッションの履歴ウィンドウに表示されませんでした。完全なWeb要求と応答を取得するために、ソースコードに何かが欠けていますか。
更新2:
この例では、次のコードセクションを含めませんでしたが、問題の原因でした。 HttpWebRequest
の Credentials
プロパティを、問題を引き起こしているADアカウントではなく、サービスアカウントで設定していました。
ソースコードの例を更新しました
解決 3
次のコード行を置き換える必要があります:
request.Credentials = new NetworkCredentials("myaccount", "mypassword", "mydomain");
with:
request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
他のヒント
使用しているWebサーバーは何ですか? IISで何かを行ったときに、 http://example.comの間でリダイレクトが発生する問題があったときに、過去のある時点で思い出すことができます。 / および http://example.com/default.asp はクエリ文字列を削除しました。
おそらく、Fiddler(またはプロトコルスニファー)を実行し、予期しない何かが起こっているかどうかを確認します。
また、完全なページ名の受け渡しが機能するかどうかも確認します。上記の場合、ほぼ確実に問題になります。
オプションで、 AllowAutoRedirectの使用を試みることができます。 HttpRequestObjectのプロパティ。