NSURLSession GET 请求:DidCompleteWithError - 错误为空

成为

目前我正在尝试从已弃用的 NSUrlConnection 切换到 NSUrlSession。我试图实现的是通过 GET 请求调用 IIS Web 服务,然后处理 XML 答案。我有两个问题:

  1. 如果答案太长,DidReceiveData 中的 NSData 对象不会包含所有内容。答案在 1036 个字符后被裁剪。
  2. 一切都完成后,虽然我已经处理了接收到的数据(无论它是否被裁剪),DidCompleteWithError 被调用。其中的“错误”参数为空,所以我不知道为什么要调用它以及如何处理它。因此,即使我收到了 DidReceiveData 中的所有数据并且一切正常,也会调用 DidCompleteWithError。

这是我的代码,感谢每一个帮助。提前致谢!

public class WebserviceCallerIOS : IWebServiceCaller
    {
        private NSMutableUrlRequest request;
        public NSUrlSessionDataTask dataTask;
        private Action<bool, string> completed;
        private string antwort;
        private NSUrlSession session;
        public NSOperationQueue myQueue;

        public void Invoke(string sUrl)
        {
            session = null;
            antwort = null;
            completed = null;
            myQueue = new NSOperationQueue();

            session = NSUrlSession.FromConfiguration(NSUrlSessionConfiguration.DefaultSessionConfiguration, (INSUrlSessionDelegate)new SessionDelegate((erfolg, body) => { completed(erfolg, body); }), myQueue);
            completed += WebserviceCallerIOS_Completed;

            try
            {
                request = CreateNativePostRequest(sUrl);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                completed(false, "Error creating request: " + e);
            }

            dataTask = session.CreateDataTask(request);
            dataTask.Resume();
        }

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

            if (nsurl == null)
                throw new Exception("Invalid URL, could not create NSUrl from: '" + url + "'.");

            var req = new NSMutableUrlRequest(nsurl) {HttpMethod = "GET"};
            return req;
        }

private class SessionDelegate : NSUrlSessionDataDelegate, INSUrlSessionDelegate
        {
            private Action<bool, string> completed_callback;
            private NSData retData;
            private int status_code;

            public SessionDelegate(Action<bool, string> completed)
            {
                completed_callback = completed;
                retData = new NSData();
            }


            public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action<NSUrlSessionResponseDisposition> completionHandler)
            {
                var http_response = response as NSHttpUrlResponse;
                if (http_response == null)
                {
                    Console.WriteLine("Received non HTTP url response: '{0}'", response);
                    status_code = -1;
                    return;
                }


                status_code = (int)http_response.StatusCode;

                if (status_code == 200)
            {
                completionHandler(NSUrlSessionResponseDisposition.Allow);
            }
            else 
            {
                completionHandler(NSUrlSessionResponseDisposition.Cancel);
            }
        }


            public override void DidCompleteWithError(NSUrlSession session, NSUrlSessionTask task, NSError error)
            {
                completed_callback(false, error?.LocalizedDescription);
            }


            public override void DidReceiveData(NSUrlSession session, NSUrlSessionDataTask dataTask, NSData data)
            {
                retData = data;
                dataTask.Suspend();
                Console.WriteLine(retData);
                completed_callback(true, retData.ToString());
            }
    }
}
ColeX - MSFT

如果答案太长,DidReceiveData 中的 NSData 对象不会包含所有内容。答案在 1036 个字符后被裁剪。

DidReceiveData将被触发并多次返回小数据。您必须创建全局变量来存储数据。但你的意思是数据一次超过 1036 个字符?

一切都完成后,虽然我已经处理了接收到的数据(无论它是否被裁剪),DidCompleteWithError 被调用。其中的“错误”参数为空,所以我不知道为什么要调用它以及如何处理它。因此,即使我收到了 DidReceiveData 中的所有数据并且一切正常,也会调用 DidCompleteWithError。

无论请求成功与否,DidCompleteWithError总是在接收到所有数据后调用。该错误null表示您的请求成功。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NSURLSession序列化错误与后请求

来自分类Dev

请求超时NSURLSession

来自分类Dev

请求桌面HTML NSURLSession

来自分类Dev

请求超时NSURLSession

来自分类Dev

GET请求的响应主体为空

来自分类Dev

Django 1.6请求POST / GET为空

来自分类Dev

即使我在HTTPMethod中设置了POST,NSURLSession也会发送GET请求

来自分类Dev

NSURLSession invalidateAndCancel:访问错误

来自分类常见问题

使用NSURLSession发送POST请求

来自分类Dev

NSURLSession跟踪多个获取请求?

来自分类Dev

使用NSURLSession发出同步请求

来自分类Dev

NSURLSession使用get发送参数

来自分类Dev

NSURLSession:获取401 HTTP错误

来自分类Dev

使用NSURLSession处理HTTP错误?

来自分类Dev

GET请求中的Dto永远不会显示为空

来自分类Dev

使用NSURLSession复制AFNetworking POST请求

来自分类Dev

在控制台中记录NSURLSession请求

来自分类Dev

nsurlsession用于循环中的多个请求

来自分类Dev

Swift中带有NSURLSession的HTTP请求

来自分类Dev

请求时间过长时,取消NSURLSession dataTask

来自分类Dev

在错误为空时调用成员函数get()

来自分类Dev

为什么model.get_weights()为空Tensorflow错误?

来自分类Dev

NSURLSession任务取消问题(CFNetwork内部错误)

来自分类Dev

Informatica Cloud错误:到雪花的空错误的连接错误为请求岗位

来自分类Dev

POST请求为空

来自分类Dev

将此.php转换为ObjC可运行的NSURLSession POST请求?

来自分类Dev

使用NSURLSession将Android post请求转换为iOS swift

来自分类Dev

在iOS中使用NSURLSession向.ts文件发出POST请求

来自分类Dev

如何确保NSURLSession响应的接收顺序与发出请求的顺序相同?