Domanda

La documentazione filtro ISAPI dice che posso chiamare SF_REQ_SEND_RESPONSE_HEADER per inviare l'intestazione di risposta, e anche accodare ulteriori intestazioni.

AddResponseHeaders per permettere un filtro di aggiungere < em> aggiuntivi intestazioni da inviare in risposta al client.

C'è un modo, in ISAPI, per Rimuovi intestazioni che altrimenti sarebbero inviati al cliente? O qualche modo per chiedere il runtime ISAPI di escludere alcune intestazioni dalla risposta? Il runtime ISAPI sembra includere sempre un server: colpo di testa, e mi piacerebbe trovare un modo per rimuovere questo.

So di poter impostare o intestazioni unset amministrativamente, in Gestione IIS, ma che non è proprio quello che voglio. Voglio farlo in fase di esecuzione nel filtro, a livello di codice, e condizionatamente.

EDIT:. BUMP

È stato utile?

Soluzione

Ho scritto diverse ISAPI, tra cui uno che aveva la funzionalità che si descrive. Ho usato SF_NOTIFY_SEND_RAW_DATA - Credo che la prima chiamata sarà l'intestazione, in modo da poter utilizzare:

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

per disattivare le notifiche per i dati grezzi futuri. Poi nella struttura HTTP_FILTER_RAW_DATA hai pvInData, che è l'intestazione corrente, ho letto e poi scrivere in un nuovo HTTP_FILTER_RAW_DATA I assegnata (ricordarsi di utilizzare FilterContext-> AllocMem sia per la struttura e pvInData). Una volta fatto, scrivere il nuovo colpo di testa fuori FilterContext-> WriteClient e tornare SF_STATUS_REQ_READ_NEXT.

Inoltre, sulla inizializzazione assicurarsi di impostare SF_NOTIFY_ORDER_HIGH e SF_NOTIFY_SEND_RAW_DATA.

Da guardando attraverso il mio vecchio codice, che è quello che ho fatto ed è stato specificamente per rimuovere un colpo di testa (più esso aggiunto anche uno), quindi sicuramente si esibirà quello che devi fare. L'unico avvertimento che posso dire è che mi ricordo qualcosa che cambia correlate a RAW_DATA da IIS5 (quando ho scritto questo) per IIS6 +, ma non ho mai avuto bisogno di aggiornare questo particolare ISAPI, quindi non so se la possibilità effettuato come è fatto o non. Speriamo che questo ti aiuta, anche se probabilmente almeno ottenuto un tumbleweed per la tua domanda! :)

Altri suggerimenti

Ho usato questo codice per riscrivere le intestazioni (Firefox non il rendering HTML b / c nessun tipo di contenuto intestazione presente)

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top