我想通過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。
我發現了更多關於這個問題的信息。顯然,CFNetwork將在開放式流通話中重新使用開放式連接。如果沒有開放的連接,那麼它將打開一個新的連接(有意義)。如果你想持久連接,你必須打開它們。這意味着您必須決定在打開一個新的流(它將重新使用現有的連接)之前,當前是否有連接打開到域,然後關閉舊的流。 – Downie 2011-10-24 13:45:19