当我尝试登录Web服务时,某些cookie会丢失。 Cookie缺少三部分,特别是令牌和刷新令牌。但是,当我尝试使用Postman登录时,会得到cookie的所有部分。这很奇怪,您可以在下面看到我的使用Flurl登录该服务的代码。
private async Task<IFlurlClient> GetClientAsync()
{
var client = new FlurlClient(BaseUrl).EnableCookies();
var login = await client.Request("/Account/LogOn")
.AllowAnyHttpStatus()
.PostUrlEncodedAsync(new { Login = credentials.Username, credentials.Password});
if (!login.IsSuccessStatusCode) throw new ResponseException("Login failed");
return client;
}
请参阅屏幕快照,以获取调试时可以看到的cookie。
接下来,我们可以查看使用邮递员时可以看到哪些cookie。
我需要所有7个cookie才能随后调用该服务。关于我可能做错了什么或可能遗失了什么的任何想法?
使用Postman时,我所要做的只是使用我拥有的凭据使用表格数据进行简单的POST。 Postman和Flurl这两个调用都成功,并且状态码为200 OK,不同之处仅在于接收到的Cookie值。
答案 0 :(得分:1)
感谢Todd,我通过更新到Flurl 3.0并更新了代码解决了我的问题。有关使用CookieSession的新版本和改进版本,请参见下文。
private async Task<CookieJar> GetCookiesAsync()
{
using var session = new CookieSession(Endpoint);
var data = new {credentials.Username, credentials.Password};
var login = await session.Request("/login").AllowAnyHttpStatus().PostUrlEncodedAsync(data);
return login.ResponseMessage.IsSuccessStatusCode ? session.Cookies : null;
}
...
var cookies = await GetCookiesAsync();
if (cookies == null) return false;
var test = await Endpoint.AppendPathSegment("/test")
.WithCookies(cookies)
.AllowAnyHttpStatus()
.PostAsync(null);
var success = test.ResponseMessage.IsSuccessStatusCode;
使用此方法,我可以传递登录到任何后续调用时收到的cookie,并且一切正常进行。
编辑:
再次更新代码以使用Todds建议,请参见下文。
private async Task<CookieSession> CreateSessionAsync()
{
using var session = new CookieSession(Endpoint);
var data = new {credentials.Username, credentials.Password};
var login = await session.Request("/login").AllowAnyHttpStatus().PostUrlEncodedAsync(data);
return login.ResponseMessage.IsSuccessStatusCode ? session : null;
}
var session = await CreateSessionAsync();
if (session == null) return false;
var test = await session.Request("/test")
.AllowAnyHttpStatus()
.PostJsonAsync(new {});
return test.ResponseMessage.IsSuccessStatusCode;
再次感谢您,托德!此解决方案目前正在生产中发挥作用。