【问题标题】:C# HttpClient.SendAsync HttpMethod.Get - how to update cookie with additional values [duplicate]C# HttpClient.SendAsync HttpMethod.Get - 如何使用附加值更新 cookie [重复]
【发布时间】:2013-01-28 15:44:08
【问题描述】:

我正在尝试使用 C# HttpClient 类发送带有 cookie 的 Http Get 消息。 HttpClient.GetAsync 只接受 URL。所以,我不能使用那种方法。 我发现HttpClient.SendAsync 方法让我可以通过以下方式发送cookie。

HttpRequestMessage GETRequest = new HttpRequestMessage(HttpMethod.Get, completeUrl);
GETRequest.Content = new FormUrlEncodedContent(formVals);
HttpResponseMessage GETResponse = client.SendAsync(GETRequest).Result;

但是当执行时,它会说 -

“无法发送具有此动词类型的内容主体”

我知道 Get 消息最适合用于获取而不是用于发布数据。但在我的情况下,cookie 存储在客户端以保存客户端首选项,我必须通过 Http Get 消息(通过 HttpClient 类)将它们发送给客户端。

我不想重新初始化 HttpClient 对象;这将改变它的 SessionID。 我不想将内容添加到获取消息。我只是问是否有任何其他方法可以使用附加值更新获取消息 cookie。

请告诉我如何处理这个问题。提前感谢您的帮助。

【问题讨论】:

  • 您认为可以将 cookie 作为消息内容发送的假设是错误的。 Cookie 以 HTTP 标头字段的形式发送。
  • 好吧,我说它是 cookie,因为我在 Fiddler 的“Cookie”属性中看到它。我将在下一篇文章中发布实际的 Get 请求响应。
  • 1st GET msg-"Cookie: Mode=Teacher; TimeZoneOffset=5; Client=MN; AirUser=SessionId=0ce9b203-66aa-43a9-8476-521d6b33b392&TeacherId=6584&StudentId=0&Name=DAC DemoTwo; querystring=查询字符串=http%3a%2f%2fdc1lohgaonkarlt%2fLPN%2fTeacher%2fBrowseMaterials.aspx;ASP.NET_SessionId=t1xadfmys5tmoz3bwnwginnw;搜索=“;第二次获取味精 - “Cookie: ....search=viewall=1&grades=&materialType=&itemSearchControl0=itm_att_Item FORMAT,SIM&itemSearchControl1=itm_att_Learning Modalities&itemSearchControl2=itm_att_Flesch-Kincaid Grade Level Readability&text=" - 在第二次请求内容中添加了第一次获取请求。
  • kmatyaszek - 你明白我的问题吗?请参阅 Fiddler 中的示例获取消息 -->> GET xxxxx/Callback.aspx?method=GetSearchResults&page=1&rnd=0.1948752427207086 HTTP/1.1 Accept: / Accept-Language: en-us Referer: xxxxx/BrowseMaterials .aspx Accept-Encoding: gzip, deflate User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) Host: xxx Connection: Keep-Alive Cookie: Mode=Teacher;时区偏移=5;客户=MN; AirUser=SessionId=0ce9b203…………
  • 这篇文章能回答你的问题吗? msdn.microsoft.com/en-us/library/dd920298(v=VS.95).aspx

标签: c# http-headers asp.net-web-api dotnet-httpclient sendasync


【解决方案1】:

您应该使用 CookieContainer 类,正如answer 中所示。这将在 HTTP 标头中设置 cookie(它们应该放置的位置)。

【讨论】:

  • 感谢您的回复。我尝试了那个 CookieContainer 类,但这将是一个 POST 消息。我需要 GET(如 GetAsync 或 SendAsync with HttpMethod.Get)。我尝试在标题中添加“Cookie”,但它被默默地忽略了。可能是因为消息中已经存在“Cookie”。如果这是要走的路,那么我不是如何编辑/更新消息头中的“Cookie”属性。
  • 这个问题让我筋疲力尽。这听起来很小,但我无法找到解决办法。请评论如何解决这种情况。
  • @srk 你真的试过了吗?根据我的测试,CookieContainer 与 GET 和 POST 的工作方式相同。如果您真的不想使用 cookie 容器,则引用问题的下一个答案可以解决。
  • 是的,我做到了。我不明白他们如何将其标记为重复问题。我的 HttpClient 类对象不带任何参数,我无法使用新的 cookie 重新初始化它的类对象。这将重置它的 SessionID(我不希望它改变)。
  • @srk 如果设置了 cookiecontainer,则使用 GetAsync 或 SendAsync 将发送 cookie。我不明白您对 HttpClientHandler 的问题。这是一个要点gist.github.com/4659969 我们可以继续那里的评论线程...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多