2011-10-17 105 views
2

我想通过Apple CFNetwork框架使用持久HTTP连接来减少我们的服务器开销。但是关于它的文档很少。我能找到的建议框架回收的唯一信息,只要适当的标志设置代表开发商的流:CFNetwork持久连接(保持活力)

 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)调用,那么我不会再收到错误。还值得一提的是,一旦我读完数据后关闭了阅读流,但也许我需要自己管理流池?

有没有人有任何文件,例子或教程,他们可以引荐我?我很想继续使用CFNetwork,因为我们有一个客户坚持我们必须尽量减少使用Obj-C。

+0

我发现了更多关于这个问题的信息。显然,CFNetwork将在开放式流通话中重新使用开放式连接。如果没有开放的连接,那么它将打开一个新的连接(有意义)。如果你想持久连接,你必须打开它们。这意味着您必须决定在打开一个新的流(它将重新使用现有的连接)之前,当前是否有连接打开到域,然后关闭旧的流。 – Downie 2011-10-24 13:45:19

回答

-1

添加CFNetwork.framework

#import <CFNetwork/CFHTTPStream.h>

+0

我不确定我了解你的答案。这有助于启用与CFHTTPStream的持久连接? – Downie 2012-02-03 11:21:14

1

我一直在挣扎了同样的事情。

看来关键是要确保所有的流设置都完全相同的请求。特别是,对于所有请求,您必须将EXACT相同的字典对象传递给kCFStreamPropertySSLSettings。他们拥有相同的内容是不够的,你必须重新使用完全相同的字典。