NSUrlSessionDataDelegate: большинство методов не вызывают - PullRequest
0 голосов
/ 30 августа 2018

вчера я хотел реализовать метод DidReceiveData для моего NSUrlSessionDataDelegate. Я заметил, что метод DidReceiveData никогда не вызывается, и хотя я пытался отследить ошибку, я заметил, что другие методы тоже не вызывают. Я почти уверен, что другие методы работали раньше, я не знаю, изменил ли я что-то или, возможно, причиной является обновление Xamarin.iOS, но, возможно, я ошибаюсь, и они никогда не работали. Я могу подтвердить эту проблему для методов DidReceiveResponse, DidReceiveData и DidCompleteWithError.

Вот код, который создает NSUrlSession и обрабатывает ответ (примечание: я вызываю IIS WebMethods, которые отвечают в XML):

           public async Task<string> Invoke(string sUrl)
    {
        session = NSUrlSession.FromConfiguration(NSUrlSessionConfiguration.DefaultSessionConfiguration, 
                                                 (INSUrlSessionDelegate)new SessionDelegate((x)=> _fehlermeldung = x),  // Übergebe Methode damit der SessionDelegate die Fehlermeldung weiterreichen kann
                                                 null);
        request = CreateGETRequest(CreateNSUrl(sUrl));

        var data = session.CreateDataTaskAsync(request, out dataTask);
        dataTask.Resume();
        NSUrlSessionDataTaskRequest response = null;
        try
        {
            response = await data;
        }
        catch (NSErrorException ex)
        {
            throw new Exception(ex.Error.LocalizedDescription + ": " + _fehlermeldung);
        }
        var doc = new XmlDocument();
        doc.LoadXml(response.Data.ToString());
        XmlNode elem = doc.DocumentElement.FirstChild;

        return elem.InnerText;
    }

    private NSUrl CreateNSUrl(string url)
    {
        string converted = ((NSString)url).CreateStringByAddingPercentEscapes(NSStringEncoding.UTF8);
        var nsurl = NSUrl.FromString(converted);

        if (nsurl == null)
            throw new Exception("Fehlerhafte URL: Aus '" + url + "' konnte kein gültiges NSUrl Objekt erzeugt werden.");

        return nsurl;
    }

    private NSMutableUrlRequest CreateGETRequest(NSUrl nsurl)
    {
        return new NSMutableUrlRequest(nsurl) { HttpMethod = "GET" };
    }

А вот моя реализация делегата сессии:

    private class SessionDelegate : NSUrlSessionDataDelegate,  INSUrlSessionDelegate
    {
        private readonly Action<string> setFehler;
        public SessionDelegate(Action<string> setFehler)
        {
            this.setFehler = setFehler;
        }

        public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action<NSUrlSessionResponseDisposition> completionHandler)
        {
            var http_response = response as NSHttpUrlResponse;
            if (http_response == null)
            {
                setFehler($"Keine HTTP Url Antwort erhalten: {Environment.NewLine}'{response}'");
                completionHandler(NSUrlSessionResponseDisposition.Cancel);
                return;
            }

            var status_code = (int)http_response.StatusCode;
            if (status_code == 200) 
            {
                completionHandler(NSUrlSessionResponseDisposition.Allow);
            }
            else
            {
                setFehler($"Verbindung abgewiesen, HTTP Status: { status_code}, '{ http_response.ToString()}'");
                completionHandler(NSUrlSessionResponseDisposition.Cancel);
            }
        }

        public override void DidReceiveData(NSUrlSession session, NSUrlSessionDataTask dataTask, NSData data)
        {
            // THIS DOES NOT GET CALLED :-(
        }

        public override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error)
        {
            if (error != null)
            {
                task.Cancel();
                var ex = new NSErrorException(error);
                throw (ex);
            }
        }

        public override void DidReceiveChallenge(NSUrlSession session, NSUrlSessionTask task, NSUrlAuthenticationChallenge challenge, Action<NSUrlSessionAuthChallengeDisposition, NSUrlCredential> completionHandler)
        {
            [...] // This is working fine for Client Cert Authentication or Basic Authentication
        }
    }

Метод DidReceiveChallenge вызывается и работает. Я вырезал его для удобства чтения. Все остальные методы не вызываются. Я хотел бы знать, что я делаю неправильно. Вы можете найти те же вопросы у нативных пользователей iOS, но я не могу понять, как реализовать их решения с помощью Xamarin.iOS.

Любая помощь приветствуется, спасибо заранее.

...