HttpClient
送受信するには WebAPI クラスを使用する必要がHttpRequestMessage
ありHttpResponseMessage
ます。
クラスの同じインスタンスを介して複数のリクエストを追跡していますHttpClient
(つまり、特定のセッション ID に対する複数のリクエスト)。最初の Get 要求は SessionID を作成します。sessionID 、HttpResponseMessage
Cookie ヘッダーなどの要素があります。
2 番目の要求では、最初の要求メッセージのヘッダーで返された Cookie にデータを追加する必要があります。HttpClient
クラスは GetGetAsync(URL)
との 2 つのメソッドのみを提供しますSendAsync(HttpRequestMessage)
。
HttpClient
クラスは GET メッセージ用に 2 つのメソッドしか提供GetAsync
していません。これは URI しか受け取らないため、役に立たないようです。SendAsync
ここでは、クラス オブジェクトを再初期HttpRequestMessage
化しないと使用できません。HttpClientHandler
HttpClient
Cookie ヘッダーを更新し、Get 要求メッセージに追加情報を追加するにはどうすればよいですか?
次のサンプルを確認してください Fiddler でキャプチャされたメッセージを取得する
1 つのサンプルをリクエストする
> GET //xxxx/xx/xxx/BrowseMaterials.aspx HTTP/1.1
> Accept: text/html,
> application/xhtml+xml, */* Referer: //xxx/xx/xx/Home.aspx
> Accept-Language: en-US User-Agent: Mozilla/5.0 (compatible; MSIE 9.0;
> Windows NT 6.1; WOW64; Trident/5.0) Accept-Encoding: gzip, deflate
> Connection: Keep-Alive Cookie: Client=MN;
> xxxx=SessionId=95ab57ca-59b0-4a13-9249-04a7f1251058&TeacherId=6584&StudentId=0&Name=DAC
> DemoTwo;
> querystring=querystring=http%3a%2f%xxxxx%2fLPN%2fTeacher%2fHome.aspx;
> ASP.NET_SessionId=t1xadfmys5tmoz3bwnwginnw; search=; Mode=Teacher;
> TimeZoneOffset=5
リクエスト 2 サンプル
> Cookie: Client=MN;
> xxx=SessionId=95ab57ca-59b0-4a13-9249-04a7f1251058&TeacherId=6584&StudentId=0&Name=DAC
> DemoTwo;
> querystring=querystring=xxxx%3a%2f%2fdxxxxxxx%2fLPN%2fTeacher%2fBrowseMaterials.aspx;
> ASP.NET_SessionId=t1xadfmys5tmoz3bwnwginnw;
> search=viewall=1&grades=&materialType=6,1,2,3,4,5&itemSearchControl0=itm_att_Item
> FORMAT&itemSearchControl1=itm_att_Learning
> Modalities&itemSearchControl2=itm_att_Flesch-Kincaid Grade Level
> Readability&text=; Mode=Teacher; TimeZoneOffset=5
HttpClient オブジェクト「クライアント」の既存のコピーを使用しています。HttpMessageHandler で再初期化できません。これを行うと、望ましくない新しい SessionID が作成されます。後続の Get/Post リクエスト間を追跡するために SessionID を使用しています。また、ブラウザと同じように Web リクエストをシミュレートする C# コンソール アプリです。他にご不明な点がありましたらお知らせください。関連するコメントをお寄せいただきありがとうございます。
C# code
アプローチ #1 HttpRequestMessage GETRequest = new HttpRequestMessage(HttpMethod.Get, completeUrl); string additionalCookVal = "viewall=1&grades=&materialType=&itemSearchControl0=itm_att_Item FORMAT,SIM&itemSearchControl1=itm_att_Learning Modalities&itemSearchControl2=itm_att_Flesch-Kincaid Grade Level Readability&text="; GETRequest.Headers.Add("Cookie1", additionalCookVal); //これは黙って無視されます HttpResponseMessage GETResponse = client.SendAsync(GETRequest).Result;
アプローチ # 2 var content = new FormUrlEncodedContent(additionalCookVals); //additionalCookVals は Dictionary オブジェクトです HttpRequestMessage GETRequest = new HttpRequestMessage(HttpMethod.Get, completeUrl); GETRequest.Content = コンテンツ; HttpResponseMessage GETResponse = client.SendAsync(GETRequest).Result; // Get メッセージにコンテンツを追加できないと言って失敗します。