HttpClientでデータをサーバへPOSTしたいのですが、エラーが返ってきます。
HttpClientで複数回HTTPSリクエストを送信する場合に、何かしなければいけないことなどありますでしょうか?
又、Authorizationヘッダの設定の仕方はあっていますでしょうか?ご教示願います。
下記curlコマンドで実行した場合は正常に成功しました。
curl
1curl -X POST -d "username=xxxxx&password=xxxxx" https://xxx/xxx/xxx/ -x http://xxx:xxx@xxx:8080 2↑このコマンドでtoken取得(aaa) 3 4curl -X POST -H "Authorization: aaa" -d "sex=xxx&year=xxx&occ=xxx&area=xxx" https://xxx/yyy/yyy/ -x http://xxx:xxx@xxx:8080 5
C#
1 string proxyAccount = ProxyUser.Text; 2 string proxyPassword = ProxyPassword.Text; 3 string proxyUrl = "http://" + Proxy.Text + ":" + Port.Text; 4 5 WebRequest.DefaultWebProxy.Credentials = new NetworkCredential(proxyAccount, proxyPassword); 6 7 // HttpClientHandlerにProxy情報を設定する 8 HttpClientHandler ch = new HttpClientHandler(); 9 ch.Proxy = new WebProxy(proxyUrl, false); 10 ch.Proxy.Credentials = new NetworkCredential(proxyAccount, proxyPassword); 11 ch.UseProxy = true; 12 13 HttpClient client = new HttpClient(ch); 14 15 Uri tokenuri = new Uri(URL.Text + "/xxx/xxx/"); 16 17 HttpRequestMessage tokenrequest = new HttpRequestMessage(HttpMethod.Post, tokenuri); 18 19 var contentList = new List<string>(); 20 contentList.Add("username=" + User.Text); 21 contentList.Add("password=" + Password.Text); 22 23 tokenrequest.Content = new StringContent(string.Join("&", contentList), 24 Encoding.UTF8, 25 "application/x-www-form-urlencoded");//CONTENT-TYPE header 26 27 var response = await client.SendAsync(tokenrequest); 28 string token = await response.Content.ReadAsStringAsync(); 29 30 //省略 レスポンスからtokenのみ取り出す。 31 32 Uri adduri = new Uri(URL.Text + "/yyy/yyy/"); 33 34 HttpRequestMessage addrequest = new HttpRequestMessage(HttpMethod.Post, adduri); 35 36 var contentList2 = new List<string>(); 37 contentList2.Add("sex=xxx"); 38 contentList2.Add("year=xxx"); 39 contentList2.Add("occ=xxx"); 40 contentList2.Add("area=xxx"); 41 42 addrequest.Headers.Add("Authorization", token); 43 addrequest.Content = new StringContent(string.Join("&", contentList2), 44 Encoding.UTF8, 45 "application/x-www-form-urlencoded");//CONTENT-TYPE header 46 47 var addresponse = await client.SendAsync(addrequest);
試したこと
・curlコマンドで実行した場合は、正常にデータを取得できた。
・上記ソースコードでは二回目のリクエスト送信に対して403エラーが返ってきた。
・tokenは正常に取得できた。
・curlコマンドで間違えたtokenを設定した場合やbody部のパラメータを間違えた場合でも403レスポンスは返ってこなかった。
・一つ目と二つ目のリクエストの間に20秒くらい時間を空けてもエラーが返ってきた。
・一つ目のトークンをとるリクエストを消して、あらかじめとっておいたトークンを固定で使用して二つ目のリクエストだけ送信したら200OKがかえってきて成功した。
固定で使用したトークンと一つ目のリクエストでとってくるトークンを比較したが全く同じ値。
・よくないことだと思うが、HttpClientやHttpClientHandlerを新たにもう一つ作成したらどちらのリクエストも成功した。
回答2件
あなたの回答
tips
プレビュー