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

我正在尝试与外部 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 返回重定向以进行身份验证。

https://img4.mukewang.com/64d886e50001794306530851.jpg

九州编程
浏览 85回答 2
2回答

侃侃尔雅

如果您不设置,HttpClient 将吃掉自定义UseCookiescookie false,using (var handler = new HttpClientHandler { UseCookies = false })using (client = new HttpClient(handler) { BaseAddress = new Uri(Path) }){&nbsp; &nbsp; &nbsp; client.DefaultRequestHeaders.Add("cookie", cookieValue);}它将尝试使用 cookie 容器,同时忽略任何自定义 cookie 标头,如果你问我的话,这是非常令人沮丧的行为。

慕雪6442864

.Net Framework 使用 Cookie 容器。同样是核心,也许它是比您现在正在做的更好的实现并且得到更多支持。小例子:var cookieContainer = new CookieContainer();            this.handler = new HttpClientHandler            {                CookieContainer = cookieContainer,                UseCookies = true            };            client = new HttpClient(handler);
打开App,查看更多内容
随时随地看视频慕课网APP