为了账号安全,请及时绑定邮箱和手机立即绑定

.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条经验 获得超15个赞

如果您不设置,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 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信