NSURLSession代理方法willPerformHTTPRedirection未调用问题排查
willPerformHTTPRedirection未被调用 我用以下代码创建NSURLSession并发起请求,但代理方法willPerformHTTPRedirection始终没有被调用,请问可能是什么原因?
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration]; self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; NSURL *url = [NSURL URLWithString:urlString]; VPNCheckResultRequest *request = [VPNCheckResultRequest message]; NSURLSessionDataTask *task = [self.session dataTaskWithRequest:[NSURLRequest requestWithURL:url]]; [task resume];
排查方向和解决方案
碰到这种情况别着急,我们可以从几个常见维度排查:
服务器根本没返回重定向响应
willPerformHTTPRedirection只有在服务器返回3xx系列的重定向状态码(比如301永久重定向、302临时重定向、307/308临时/永久跳转)时才会触发。你可以通过抓包工具或者打印响应头的方式,确认服务器是否真的返回了重定向指令。如果服务器返回的是200、404这类非重定向状态码,代理方法自然不会被调用。会话配置自动接管了重定向
默认情况下,NSURLSessionConfiguration的allowsRedirects属性是YES,也就是系统会自动跟随重定向,不会走到代理方法。如果你想手动拦截重定向逻辑,需要显式把这个属性设为NO:config.allowsRedirects = NO;修改后,系统就会触发
willPerformHTTPRedirection代理方法,让你决定是否跟随重定向。实际发送的请求不符合预期
看你代码里创建了VPNCheckResultRequest但并没有用到它——你实际发起请求用的是[NSURLRequest requestWithURL:url]。如果VPNCheckResultRequest是自定义的请求(比如带有特定请求头、参数或者body),那你相当于没把这个自定义请求传给dataTask,导致实际发送的请求和预期不符,没有触发服务器的重定向规则。代理对象提前被释放
一定要确保你的self(也就是session的delegate)在整个请求生命周期内没有被提前销毁。如果delegate在请求发起后就被释放了,系统就无法回调代理方法。你可以检查self的引用计数,或者确保用强引用持有delegate对象(如果之前用的是弱引用的话)。跨域重定向被系统安全策略拦截
这种情况比较少见,但某些跨域重定向可能会被系统的安全机制拦截。你可以先尝试用同一个域名的重定向地址测试,看是否能触发代理方法,排除跨域的影响。
内容的提问来源于stack exchange,提问作者Viktorianec

