Ale*_*ler 8 c# dotnet-httpclient asp.net-core
对不起,标题太糟糕了,我不太确定如何用简短的标题格式来表达我的问题。
我正在尝试与外部 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"));
// Have to parse the string this way otherwise it'll break the dates
JToken token;
using (var sr = new StringReader(value))
using (var jr = new JsonTextReader(sr) { DateParseHandling = DateParseHandling.None })
{
token = JToken.ReadFrom(jr);
}
HttpResponseMessage response2 = await client.PostAsJsonAsync(apiname, token);
string responseBody = await response2.Content.ReadAsStringAsync();
return responseBody;
}
Run Code Online (Sandbox Code Playgroud)
这一切都非常适合作为 .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 返回重定向以进行身份验证。
小智 5
如果您不设置,HttpClient 将吃掉自定义UseCookiescookie false,
using (var handler = new HttpClientHandler { UseCookies = false })
using (client = new HttpClient(handler) { BaseAddress = new Uri(Path) }){
client.DefaultRequestHeaders.Add("cookie", cookieValue);
}
Run Code Online (Sandbox Code Playgroud)
它将尝试使用 cookie 容器,同时忽略任何自定义 cookie 标头,如果你问我的话,这是非常令人沮丧的行为。