我必须使用 WebAPIHttpClient
类来发送和接收HttpRequestMessage
和HttpResponseMessage
.
我正在通过同一个HttpClient
类实例跟踪多个请求(即对特定 sessionID 的多个请求)。第一个 Get 请求创建 SessionID;它HttpResponseMessage
有 sessionID、cookie header 等元素。
对于第二个请求,我必须在第一个请求消息的标头中向返回的 cookie 添加附加数据。HttpClient
类仅提供两种方法用于 Get -GetAsync(URL)
和SendAsync(HttpRequestMessage)
.
HttpClient
类只为 GET 消息提供了两种方法——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,这是不需要的。我正在使用 SessionID 在后续的 Get/Post 请求之间进行跟踪。此外,它是 C# 控制台应用程序,可以像浏览器一样模拟 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 = 内容;HttpResponseMessage GETResponse = client.SendAsync(GETRequest).Result; // 无法将内容添加到获取消息中。