.Net 4.5'te HttpClient ile tanımlama bilgisini yanıt dışı bırakmaya çalışırken mücadele


107

Başarıyla çalışan aşağıdaki kodu aldım. Çerezi yanıttan nasıl çıkaracağımı çözemiyorum. Amacım, istekte tanımlama bilgileri ayarlayabilmek ve yanıttan tanımlama bilgileri alabilmek. Düşünceler?

private async Task<string> Login(string username, string password)
{
    try
    {
        string url = "http://app.agelessemail.com/account/login/";
        Uri address = new Uri(url);
        var postData = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("username", username),
            new KeyValuePair<string, string>("password ", password)
        };

        HttpContent content = new FormUrlEncodedContent(postData);
        var cookieJar = new CookieContainer();
        var handler = new HttpClientHandler
        {
            CookieContainer = cookieJar,
            UseCookies = true,
            UseDefaultCredentials = false
        };

        var client = new HttpClient(handler)
        {
            BaseAddress = address
        };


        HttpResponseMessage response = await client.PostAsync(url,content);
        response.EnsureSuccessStatusCode();
        string body = await response.Content.ReadAsStringAsync();
        return body;
    }
    catch (Exception e)
    {
        return e.ToString();
    }
}

İşte tam cevap:

HttpResponseMessage response = await client.PostAsync(url,content);
response.EnsureSuccessStatusCode();

Uri uri = new Uri(UrlBase);
var responseCookies = cookieJar.GetCookies(uri);
foreach (Cookie cookie in responseCookies)
{
    string cookieName = cookie.Name;
    string cookieValue = cookie.Value;
}

Merak ettiğim için, müşteride çerezleri neden okumak istediğinizi sorabilir miyim? Anladığım kadarıyla tanımlama bilgileri, bilgi döndürmek için değil sunucuya bilgi göndermek için kullanılır.
Darrel Miller

Döndürülen tanımlama bilgisini JSON döndüren çağrılarda kullanıyorum, böylece her JSON çağrısı için ayrı bir yetkilendirme çağrısı yapmak zorunda kalmam. Yani, JSON döndüren bir çağrı günlüğüm var / Home / GetData, ancak yalnızca yetkilendirilmişse. İstemci isteği üzerine, / Home / GetData'nın yanıt vermesi için çerezi ekliyorum. Aksi takdirde "403" yetkisiz diyecektir.
Peter Kellner

Yetkilendirme başlığını varsayılan bir başlık olarak ayarlamak neredeyse etkilidir ve biraz daha standarttır. Sunucunun kimlik doğrulama başlığını istemci adına otomatik olarak ayarlamasının hiçbir yolu yoktur.
Darrel Miller

1
Darrel bahşiş için teşekkürler. Asp.net'te neye benzeyebileceğine dair herhangi bir örnek var mı? Monotonluğum için bununla mücadele ettim ve şimdi Windows mağazası uygulamam. Basit bir yolu olsaydı mutlu olurdum. Bu, özellikle zaman uyumsuz olduğunda bir acıdır ve şimdi Windows mağaza uygulamalarında beklemekteyiz.
Peter Kellner

Yanıtlar:


170

Bir isteğe çerez eklemek için, çerez kapsayıcısını talepten önce ile doldurun CookieContainer.Add(uri, cookie). Talep yapıldıktan sonra, çerez kutusu otomatik olarak yanıttaki tüm çerezlerle doldurulacaktır. Daha sonra onları geri almak için GetCookies () 'i çağırabilirsiniz.

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;

HttpClient client = new HttpClient(handler);
HttpResponseMessage response = client.GetAsync("http://google.com").Result;

Uri uri = new Uri("http://google.com");
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
    Console.WriteLine(cookie.Name + ": " + cookie.Value);

Console.ReadLine();

8
Not: İlk aramada ilk çerezleri aldıktan sonra, aynı etki alanından herhangi bir sayfaya erişirken, çerezler otomatik olarak gönderilir, ek adım gerekmez.
Jahmic

"Using System.linq;" eklemelisiniz
Cabuxa.Mapache

^^ System.Linq yalnızca .Cast <> yöntemini kullanmak istiyorsanız gereklidir, tanımlama bilgisi almak için gerekli değildir, ancak bu kendi kendini açıklayıcı olmalıdır :)
MikeDub

httpclientHttpclient fabrikasından oluşturulmuşsa çerezleri aynı şekilde almak mümkün müdür ? ie builder yöntemi hizmetlere
eklendi.AddHttpClient

Async'de "google.com" a zaten bir referans yaptık, neden tekrar referansla bir URI bildirmemiz gerekiyor?
Malcolm Salvador

7

Eğer erişiminiz HttpClientyoksa ve CookieContainer. Bu, .NET Core 2.2'de çalışır:

private string GetCookie(HttpResponseMessage message)
{
    message.Headers.TryGetValues("Set-Cookie", out var setCookie);
    var setCookieString = setCookie.Single();
    var cookieTokens = setCookieString.Split(';');
    var firstCookie = cookieTokens.FirstOrDefault();
    var keyValueTokens = firstCookie.Split('=');
    var valueString = keyValueTokens[1];
    var cookieValue = HttpUtility.UrlDecode(valueString);
    return cookieValue;
}

1
Parlak ve çiğ ama tam ihtiyacım olan şey ... İyi iş, teşekkürler.
Vedran Mandiç

5

Verilen URL ile kolayca bir çerez değeri elde edebilirsiniz.

private async Task<string> GetCookieValue(string url, string cookieName)
{
    var cookieContainer = new CookieContainer();
    var uri = new Uri(url);
    using (var httpClientHandler = new HttpClientHandler
    {
        CookieContainer = cookieContainer
    })
    {
        using (var httpClient = new HttpClient(httpClientHandler))
        {
            await httpClient.GetAsync(uri);
            var cookie = cookieContainer.GetCookies(uri).Cast<Cookie>().FirstOrDefault(x => x.Name == cookieName);
            return cookie?.Value;
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.