2

我试图通过 Apple CFNetwork 框架使用持久的 HTTP 连接来减少我们的服务器开销。但是,关于它的文档很少。我能找到的唯一信息表明,只要设置了适当的标志,框架就会代表开发人员回收流:

        CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, methodString, url, kCFHTTPVersion1_1);
        CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Keep-Alive"), CFSTR("120")); <--- This line

        //Set message body if we're posting
        if (msDetails.eType == HttpRequestDetails::POST)
        {
            CFDataRef bodyRef = CFDataCreate(kCFAllocatorDefault, (const UInt8*)msDetails.strBody.c_str(), msDetails.strBody.length());
            CFHTTPMessageSetBody(request, bodyRef);
            CFRelease(bodyRef); 
        }

        //Create the read stream...
        CFReadStreamRef ReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);

        //...use persistent connections..
        CFReadStreamSetProperty(ReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue); <--- This line

        //...enable SSL if the URL is https
        if(msDetails.strURL[4] == 's')
        {
            //Hey an https request
            CFMutableDictionaryRef pDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
            CFDictionarySetValue(pDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
            CFDictionarySetValue(pDict, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelSSLv3);
            CFReadStreamSetProperty(ReadStream, kCFStreamPropertySSLSettings, pDict);
            CFRelease(pDict);
        }

        CFReadStreamOpen(ReadStream);

上面的代码会导致“CFNetwork 内部错误”。如果我删除 CFReadStreamSetProperty(ReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue) 调用,那么我不再收到错误。还值得一提的是,我在读完数据后关闭了 readstream,但也许我需要自己管理流池?

有没有人可以参考我的任何文档、示例或教程?我热衷于继续使用 CFNetwork 的东西,因为我们有一个客户坚持我们必须尽量减少对 Obj-C 的使用。

4

2 回答 2

1

我一直在为同样的事情而苦苦挣扎。

似乎关键是要确保请求的所有流设置都完全相同。特别是,对于所有请求,您必须将完全相同的字典对象传递给 kCFStreamPropertySSLSettings。它们具有相同的内容是不够的,您必须重复使用完全相同的字典。

于 2012-06-18T18:42:40.493 回答
-1

添加CFNetwork.framework

#import <CFNetwork/CFHTTPStream.h>

于 2012-02-02T10:43:26.637 回答