none
Cookies aus HttpResponseMessage RRS feed

  • Frage

  • Hallo,

    da ja der Standard Http- und Webrequest unter UWP nicht wie gewohnt funktionieren musste ich einen HttpClient benutzen. Dieser liefert mir als Antwort eine HttpResponseMessage. In dieser HttpResponseMessage steckt der Cookie. Dessen Inhalt konnte ich in eine Liste transferieren welche so aussieht:

    [0] PHPSESSID=ct39vbhusgicbt8ks1hhtdof52; path=/
    [1] isMobile=0; expires=Tue, 15-May-2018 17:23:36 GMT; Max-Age=31536000; path=/
    [2] showMobile=0; expires=Tue, 15-May-2018 17:23:36 GMT; Max-Age=31536000; path=/
    [3] PHPSESSID=eku8v23gioe3g6bl5muludl050; path=/

    Die Frage ist, wie bekomme ich das als Cookie oder Cookies in eine CookieCollection?

    Montag, 15. Mai 2017 18:05

Antworten

  • Ich habe es jetzt so gelöst, aber trotzdem danke:

    [assembly: Xamarin.Forms.Dependency(typeof(VisomaApi))]
    namespace VisomaTickets.UWP.DeviceSpecific
    {
        public class VisomaApi : IVisomaApi
        {
            private HttpResponseMessage httpResponseMessage;
            private CookieCollection cookieCollection;
    
            public bool ConnectionTest()
            {
                return httpResponseMessage.IsSuccessStatusCode;
            }
    
            public CookieCollection GetCookies()
            {
                return cookieCollection;
            }
    
            public void Init(string apiUrl, string apiUser, string apiPassword)
            {
                var httpClient = new HttpClient();
                cookieCollection = new CookieCollection();
                var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, apiUrl + @"api2/ConnectionTest");
                httpRequestMessage.Headers.Add("X_VSM_USERNAME", apiUser);
                httpRequestMessage.Headers.Add("X_VSM_PASSWORD", apiPassword);
                try
                {
                    Task.Run(async () => { httpResponseMessage = await httpClient.SendAsync(httpRequestMessage); }).Wait();
                    IEnumerable<string> cookieValues;
                    var cookieContainer = new CookieContainer();
                    if (httpResponseMessage.Headers.TryGetValues("Set-Cookie", out cookieValues))
                    {
                        List<string> cookieValuesList = cookieValues.Where(x=> x.Contains("PHPSESSID")).Select(x => x).ToList();
                        cookieContainer.SetCookies(httpRequestMessage.RequestUri, cookieValuesList.Last());
                        cookieCollection = cookieContainer.GetCookies(httpRequestMessage.RequestUri);
                    }
                }
                catch (Exception)
                {
                    httpResponseMessage = new HttpResponseMessage();
                }
            }
        }
    }

    • Als Antwort markiert Marcus Runge Montag, 15. Mai 2017 23:16
    Montag, 15. Mai 2017 23:15

Alle Antworten

  • Hallo,

    hast Du das schon versucht:

    public static CookieContainer ReadCookies(this HttpResponseMessage response)
    {
        var pageUri = response.RequestMessage.RequestUri;
    
        var cookieContainer = new CookieContainer();
        IEnumerable<string> cookies;
        if (response.Headers.TryGetValues("set-cookie", out cookies))
        {
            foreach (var c in cookies)
            {
                cookieContainer.SetCookies(pageUri, c);
            }
        }
    
        return cookieContainer;
    }

    Den Code habe ich von hier Link

    Vielleicht hilft Dir auch das Link



    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Montag, 15. Mai 2017 21:29
  • Ich habe es jetzt so gelöst, aber trotzdem danke:

    [assembly: Xamarin.Forms.Dependency(typeof(VisomaApi))]
    namespace VisomaTickets.UWP.DeviceSpecific
    {
        public class VisomaApi : IVisomaApi
        {
            private HttpResponseMessage httpResponseMessage;
            private CookieCollection cookieCollection;
    
            public bool ConnectionTest()
            {
                return httpResponseMessage.IsSuccessStatusCode;
            }
    
            public CookieCollection GetCookies()
            {
                return cookieCollection;
            }
    
            public void Init(string apiUrl, string apiUser, string apiPassword)
            {
                var httpClient = new HttpClient();
                cookieCollection = new CookieCollection();
                var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, apiUrl + @"api2/ConnectionTest");
                httpRequestMessage.Headers.Add("X_VSM_USERNAME", apiUser);
                httpRequestMessage.Headers.Add("X_VSM_PASSWORD", apiPassword);
                try
                {
                    Task.Run(async () => { httpResponseMessage = await httpClient.SendAsync(httpRequestMessage); }).Wait();
                    IEnumerable<string> cookieValues;
                    var cookieContainer = new CookieContainer();
                    if (httpResponseMessage.Headers.TryGetValues("Set-Cookie", out cookieValues))
                    {
                        List<string> cookieValuesList = cookieValues.Where(x=> x.Contains("PHPSESSID")).Select(x => x).ToList();
                        cookieContainer.SetCookies(httpRequestMessage.RequestUri, cookieValuesList.Last());
                        cookieCollection = cookieContainer.GetCookies(httpRequestMessage.RequestUri);
                    }
                }
                catch (Exception)
                {
                    httpResponseMessage = new HttpResponseMessage();
                }
            }
        }
    }

    • Als Antwort markiert Marcus Runge Montag, 15. Mai 2017 23:16
    Montag, 15. Mai 2017 23:15
  • Und hier findet der Login mit dem Cookie statt:

    [assembly: ExportRenderer(typeof(Xamarin.Forms.WebView), typeof(UwpWebViewRenderer))]
    
    namespace VisomaTickets.UWP.DeviceSpecific
    {
        public class UwpWebViewRenderer : WebViewRenderer
        {
            protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
            {
                base.OnElementChanged(e);
                if (Control != null && e.NewElement != null) SetupControlSettings();
            }
    
            private void SetupControlSettings()
            {
                Control.Settings.IsJavaScriptEnabled = true;
                HttpBaseProtocolFilter httpBaseProtocolFilter = new HttpBaseProtocolFilter();
                var cookieManager = httpBaseProtocolFilter.CookieManager;
                var cookieCollection = UserInfo.CookieContainer.GetCookies(new Uri(UserInfo.UriString));
                var httpCookie = new HttpCookie(cookieCollection["PHPSESSID"].Name, cookieCollection["PHPSESSID"].Domain, @"/");
                httpCookie.Value = cookieCollection["PHPSESSID"].Value;
                cookieManager.SetCookie(httpCookie);
            }
        }
    }

    Montag, 15. Mai 2017 23:17