我必须使用WebAPI HttpClient
课程来发送和接收HttpRequestMessage
和HttpResponseMessage
。
我通过HttpClient
类的同一实例跟踪多个请求(即对特定会话ID的多个请求)。第一个Get请求创建SessionID;其HttpResponseMessage
具有sessionID,cookie标头等元素。
对于第二个请求,我必须在第一个请求消息的标头中向返回的cookie添加其他数据。 HttpClient
类只为Get - GetAsync(URL)
和SendAsync(HttpRequestMessage)
提供了两种方法。
HttpClient
类只为GET消息提供了两种方法 - GetAsync
,它只接受URI,因此似乎没用。 SendAsync
需要HttpRequestMessage
,在此处,如果不重新HttpClientHandler
类对象,则无法使用HttpClient
。
如何更新Cookie标头并向Get请求消息添加其他信息?
检查以下示例获取在Fiddler中捕获的消息
> 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
> 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对象“client”的现有副本。我无法使用HttpMessageHandler重新初始化它。这样做会创建新的SessionID,这是不希望的。我正在使用SessionID来跟踪后续的Get / Post请求。 此外,它是C#console app。,像浏览器一样模拟Web请求。如果您有任何其他问题,请与我们联系。 感谢所有人的相关意见。
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 = content; HttpResponseMessage GETResponse = client.SendAsync(GETRequest).Result; //它无法说内容无法添加到Get消息中。