2016-08-11 6 views
1

Wissen Sie, wie Sie einen benutzerdefinierten Header auf einem TISAPIRequest manuell hinzufügen können?Hinzufügen eines benutzerdefinierten Headers auf einem TISAPIRequest (Delphi 10.1 Datasnap Server)

Diese Klasse (oder die allgemeinste TWebRequest) stellt keine RawHeaders-Eigenschaft bereit, um das Hinzufügen neuer benutzerdefinierter Header bei Bedarf zu ermöglichen.

PS: Ich habe eine unreine Lösung für meine WebRequest ist ein TIdHTTPAppRequest (Datasnap Standalone-Server), weil ich dann eine Helper-Klasse für den Zugriff auf seine private FRequestInfo-Eigenschaft erstellen kann, und von dort Zugriff auf eine RawHeaders, die Ich kann einen neuen Header hinzufügen. Aber ich verwende nur Standalone-Server für Entwicklung und Test, die Produktionsumgebung muss auf IIS-Servern laufen.

TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest 
    public 
    function GetRequestInfo: TIdEntityHeaderInfo; 
    end; 

implementation 

function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo; 
begin 
    Result := FRequestInfo; 
end; 

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
var Token: string; 
begin 
    Response.SetCustomHeader('Access-Control-Allow-Origin','*'); 

    Token := Request.Query; 

    if Copy(Token, 1, 10) = 'dssession=' then begin 
    if Request is TIdHTTPAppRequest then begin 
     TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.AddValue('Pragma', Token); 
    end; 
    end; 

    if FServerFunctionInvokerAction <> nil then 
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker; 
end; 

Es ist möglich, einen ähnlichen Code zu schreiben, um das gleiche Ergebnis zu erhalten (einen benutzerdefinierten Header zu WebRequest hinzufügen), wenn der WebRequest eine TISAPIRequest statt THTTPAppRequest ist?.

Vielen Dank.

Antwort

2

TISAPIRequest hat eine öffentliche ECB-Eigenschaft, die einen Zeiger auf die Struktur ISAPI EXTENSION_CONTROL_BLOCK zurückgibt, die die zugrunde liegenden Anforderungsdaten darstellt. Die ECB ermöglicht es Ihnen jedoch nicht, die Anforderungsheader in irgendeiner Weise zu ändern, nur Werte von ihnen zu lesen. Sie können jedoch benutzerdefinierte Antwortheader über die ECB festlegen.

Die einzige Möglichkeit, benutzerdefinierte Anforderungsheaderwerte in ISAPI hinzuzufügen/zu ändern, besteht darin, eine ISAPI Filter DLL zu schreiben, die außerhalb des Gültigkeitsbereichs von TISAPIRequest liegt. In der exportierten HttpFilterProc()-Funktion der DLL stellt die SF_NOTIFY_PREPROC_HEADERS-Benachrichtigung eine HTTP_FILTER_PREPROC_HEADERS-Struktur bereit, die Zeiger auf AddHeader() und SetHeader() Funktionen zum Hinzufügen/Ändern von Anforderungsheaderwerten enthält.

+0

Danke Remy, ich werde schauen, um diesen ISAPI Filter zu schreiben. –

Verwandte Themen