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 を閉じますが、ストリーム プールを自分で管理する必要があるのではないでしょうか?

誰かが私に紹介できるドキュメント、例、またはチュートリアルを持っていますか? Obj-C の使用を最小限に抑える必要があると主張するクライアントがいるので、CFNetwork を使い続けたいと思っています。

4

2 に答える 2

1

私は同じことで苦労してきました。

重要なのは、すべてのストリーム設定がリクエストに対して完全に同じであることを確認することだと思われます。特に、すべてのリクエストについて、まったく同じディクショナリオブジェクトをkCFStreamPropertySSLSettingsに渡す必要があります。それらが同じ内容であるだけでは十分ではありません。まったく同じ辞書を再利用する必要があります。

于 2012-06-18T18:42:40.493 に答える
-1

追加CFNetwork.framework

#import <CFNetwork/CFHTTPStream.h>

于 2012-02-02T10:43:26.637 に答える