0

ダイジェスト認証を使用してWebサーバー(Apache 2.2.17)と通信しようとし、POSTメソッドを使用してデータを送信しようとすると、問題が発生します。常に401エラーが返されます。ただし、データを投稿しない場合、またはFiddlerが実行されている場合(データを投稿する場合でも)はうまく機能します...問題の原因について考えていますか?

public void DoRequest(string v_strURL, XmlDocument v_objXMLDoc)
{

var credentialCache = new CredentialCache();

credentialCache.Add(new Uri("http://" + ServerIP + "/"), "Digest", new NetworkCredential("admin", "test", "realm"));

String RequestContent = "request=" + v_objXMLDoc.InnerXml.Replace(' ', '+');
Uri Url = new Uri(v_strURL);

HttpWebRequest objHttpWebRequest;
HttpWebResponse objHttpWebResponse = null;

Stream objRequestStream = null;

byte[] bytes = new byte[0];
bytes = System.Text.Encoding.UTF8.GetBytes(RequestContent);

objHttpWebRequest = (HttpWebRequest)WebRequest.Create(v_strURL);
objHttpWebRequest.UserAgent = "MySampleCode";
objHttpWebRequest.Credentials = credentialCache;
objHttpWebRequest.Method = "POST";
objHttpWebRequest.ContentLength = bytes.Length;
objHttpWebRequest.ContentType = "text/xml; encoding='utf-8'";
objHttpWebRequest.ContentType = "application/x-www-form-urlencoded";

objRequestStream = objHttpWebRequest.GetRequestStream();
objRequestStream.Write(bytes, 0, bytes.Length);
objRequestStream.Close();

objHttpWebResponse = (HttpWebResponse)objHttpWebRequest.GetResponse();

}
4

3 に答える 3

2

Content-Typeヘッダーを2回設定する理由はありますか?それはあなたがしたいことをする可能性は低いです。また、なぜホスト名ではなくサーバーIPを使用してクレジットをキャッシュに入れるのですか?

HTTP / 401は、サーバーがクライアントに資格情報を要求していることを示しています。クライアントは、クレデンシャルを添付してリクエストを再送信することで応答することが期待されています。重要な質問の1つは、失敗した場合、クライアントがクレデンシャルを送信しようとして拒否されたのか、それともクレデンシャルをまったく送信しようとしなかったのかということです。

Fiddlerが問題を「魔法のように」修正している場合は、低レベルの外観にNetmonまたはWiresharkを使用する必要があります。

于 2011-09-05T16:31:39.620 に答える
1

HttpWebRequest.Create()呼び出し(つまりv_strUrl)のホスト名は、credentialCache.Add()(つまりServerIP)の呼び出しのホスト名と同じですか?そうでない場合、これは常に失敗します。

CredentialCacheを使用する代わりに、資格情報をHttpWebRequestオブジェクトに直接追加するだけです

request.Credentials = new NetworkCredential( "user"、 "password"、 "realm");

それが機能するかどうかを確認します。

于 2011-09-05T19:31:04.307 に答える
0

私たちはついに問題を解決しました:

objHttpWebRequest.ServicePoint.Expect100Continue = false;
于 2011-09-14T09:20:14.270 に答える