3

ISAPI フィルターのドキュメントには、 SF_REQ_SEND_RESPONSE_HEADERを呼び出して応答ヘッダーを送信し、追加のヘッダーを追加できると書かれています。

ISAPI にはAddResponseHeadersもあり、クライアントへの応答で送信される追加のヘッダーをフィルタで追加できます。

ISAPI で、そうでなければクライアントに送信されるヘッダーを削除する方法はありますか? または、応答から特定のヘッダーを除外するように ISAPI ランタイムに要求する方法はありますか? ISAPI ランタイムには常に Server: ヘッダーが含まれているようです。これを削除する方法を見つけたいと思います。

IIS マネージャーでヘッダーを管理的に設定または設定解除できることは知っていますが、それは私が望んでいるものではありません。実行時にフィルターで、プログラムで、条件付きで実行したいと考えています。

編集:バンプ。

4

2 に答える 2

2

あなたが説明した機能を備えたものを含め、いくつかのISAPIを作成しました。私は SF_NOTIFY_SEND_RAW_DATA を使用しました-最初の呼び出しはヘッダーになると思うので、次を使用できます:

FilterContext->ServerSupportFunction(FilterContext, SF_REQ_DISABLE_NOTIFICATIONS, 0, SF_NOTIFY_SEND_RAW_DATA, 0);

今後の生データの通知を無効にします。次に、現在のヘッダーである pvInData を取得した HTTP_FILTER_RAW_DATA 構造体を読み込んで、割り当てた新しい HTTP_FILTER_RAW_DATA に書き込みます (構造体と pvInData の両方に FilterContext->AllocMem を使用することを忘れないでください)。完了したら、新しいヘッダーを FilterContext->WriteClient に書き込み、SF_STATUS_REQ_READ_NEXT を返します。

また、初期化時に SF_NOTIFY_ORDER_HIGH と SF_NOTIFY_SEND_RAW_DATA を設定してください。

私の古いコードを見てみると、それが私がやったことであり、特にヘッダーを削除することでした(さらにヘッダーも追加しました)ので、必要なことは確実に実行されます。私が言う唯一の注意点は、RAW_DATA に関連して IIS5 (私がこれを書いたとき) から IIS6+ に変更したことを覚えているということですが、この特定の ISAPI を更新する必要はまったくなかったので、チャンスがそれがどのように行われたか、またはどのように影響したかはわかりません。いいえ。うまくいけば、これがあなたの助けになることを願っていますが、少なくともあなたの質問にはタンブルウィードがあったでしょう! :)

于 2010-01-07T00:43:02.333 に答える
1

このコードを使用してヘッダーを書き換えました(FireforはHTML b / cをレンダリングせず、コンテンツタイプのヘッダーは存在しません)

DWORD CMyAuthFilterImpl::OnSendRawData(PHTTP_FILTER_CONTEXT pfc, DWORD NotoficationType, LPVOID pvNotification)
{
SF_STATUS_TYPE retStatus =  SF_STATUS_REQ_NEXT_NOTIFICATION;

if(m_bWriteHeader)
{
    //rewriting response headers with correct information
    pfc->ServerSupportFunction(pfc, SF_REQ_DISABLE_NOTIFICATIONS, 0, SF_NOTIFY_SEND_RAW_DATA, 0);

    PHTTP_FILTER_RAW_DATA pSD = (PHTTP_FILTER_RAW_DATA)pvNotification;
    DWORD dL = (DWORD)m_pszHeaders.length();
    pSD->pvInData = pfc->AllocMem(pfc, dL, 0);

    memcpy(pSD->pvInData, (void*)m_pszHeaders.data(), dL);
    pSD->cbInData = dL;

    m_bWriteHeader=FALSE;

    m_dwordHeaderLength=0;
    m_pszHeaders.~basic_string();
    retStatus =  SF_STATUS_REQ_NEXT_NOTIFICATION;

}


return retStatus;
}
于 2012-04-17T21:07:08.787 に答える