亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.NET Core Httpclient 可以工作,但 .Net Framework 4.7.2

.NET Core Httpclient 可以工作,但 .Net Framework 4.7.2

C#
九州編程 2023-08-13 15:29:15
我正在嘗試與外部 API 進行通信。我向該 API 發出基本身份驗證請求,并從該 API 獲取 x-csrf-token 和會話令牌。然后,我向該 API 發出另一個請求,現在使用 x-csrf-token 作為標頭,并將會話令牌作為“cookie”附加到標頭。維護 API 的團隊向我發送了一個處理上述所有內容的示例項目,它看起來像這樣:public static async Task<string> Send(string apiname, string value){    // Fetch the authorization tokens from SAP    HttpClient client = new HttpClient();    client.BaseAddress = new Uri(basePath);    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(user + ":" + password)));    client.DefaultRequestHeaders.Add("x-csrf-token", "Fetch");    string csrfToken = "";    string sessionCookie = "";    HttpResponseMessage response = await client.GetAsync(string.Empty);    IEnumerable<string> values;    if (response.Headers.TryGetValues("x-csrf-token", out values))    {        csrfToken = values.FirstOrDefault();    }    if (response.Headers.TryGetValues("set-cookie", out values))    {        sessionCookie = values.Where(s => s.StartsWith("SAP_SESSION")).FirstOrDefault();    }    // Reinstantiate the HttpClient, adding the tokens we just got from SAP    client = new HttpClient();    client.DefaultRequestHeaders.Add("x-csrf-token", csrfToken);    client.DefaultRequestHeaders.Add("cookie", sessionCookie);    client.BaseAddress = new Uri(basePath);    client.DefaultRequestHeaders.Accept.Clear();    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));這一切都可以很好地用作 .NET Core webAPI(也可以用作 .netcore 控制臺應用程序)。有趣的是(無論如何,在我看來),當我在 .net 4.7.2 項目中使用完全相同的代碼時,它沒有正確附加“cookie”標頭,因此我從 API 獲得了未經授權的重定向。為了絕對確定我沒有更改任何代碼,我從頭開始使用全新的 .netcore 2.0 控制臺應用程序和全新的 .net 4.7.2 控制臺應用程序,并復制粘貼完全相同的代碼并安裝相同的 nuget包(Newtonsoft.JSON 和 Microsoft.WebApi.Client)。我使用 fiddler 檢查了我的網絡流量(如下所示),您可以看到在 .netcore 中,cookie 正確附加并且一切正常,但在 .net 4.7.2 中,API 返回重定向以進行身份驗證。
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

如果您不設置,HttpClient 將吃掉自定義UseCookiescookie false,


using (var handler = new HttpClientHandler { UseCookies = false })

using (client = new HttpClient(handler) { BaseAddress = new Uri(Path) }){

      client.DefaultRequestHeaders.Add("cookie", cookieValue);

}

它將嘗試使用 cookie 容器,同時忽略任何自定義 cookie 標頭,如果你問我的話,這是非常令人沮喪的行為。


查看完整回答
反對 回復 2023-08-13
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

.Net Framework 使用 Cookie 容器。

同樣是核心,也許它是比您現在正在做的更好的實現并且得到更多支持。

小例子:

var cookieContainer = new CookieContainer();

? ? ? ? ? ? this.handler = new HttpClientHandler

? ? ? ? ? ? {

? ? ? ? ? ? ? ? CookieContainer = cookieContainer,

? ? ? ? ? ? ? ? UseCookies = true

? ? ? ? ? ? };

? ? ? ? ? ? client = new HttpClient(handler);


查看完整回答
反對 回復 2023-08-13
  • 2 回答
  • 0 關注
  • 167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號