2011-10-17 135 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。他們擁有相同的內容是不夠的,你必須重新使用完全相同的字典。