我使用Delphi XE4使用与ISAPI的内容协商编写了一个Web服务。
我的代码包含
ARequest.GetFieldByName('Accept-Language')
如果我使用独立服务器(Indy Bridge),输出正确的值,但如果我在Apache中使用ISAPI DLL,则输出为空。
我有没有办法在Apache中使用ISAPI访问此头字段?
答案 0 :(得分:1)
由于ISAPI是CGI的继承者,因此'默认' HTTP标头转换为CGI样式参数,因此您需要使用扩展控制块HTTP_ACCEPT_LANGUAGE
来请求GetServerVariable
。像这样:
function GetVar(pecb: PEXTENSION_CONTROL_BLOCK; const key:AnsiString):AnsiString;
var
l:cardinal;
begin
l:=$10000;
SetLength(Result,l);
if not(pecb.GetServerVariable(pecb.ConnID,PAnsiChar(key),PAnsiChar(Result),l)) then
if GetLastError=ERROR_INVALID_INDEX then l:=1 else RaiseLastOSError;
SetLength(Result,l-1);
end;
//
GetVar(ecb,'HTTP_ACCEPT_LANGUAGE')
答案 1 :(得分:0)
我使用以下函数使其在Apache和独立的EXE上运行:
function GetHTTPHeader(ARequest: TWebRequest; AHeaderName: AnsiString): AnsiString;
function ConvertToCGIStyle(AStr: AnsiString): AnsiString;
var
tmp: string;
begin
tmp := string(AStr); // "tmp" used to avoid Unicode warnings
tmp := UpperCase(tmp);
tmp := StringReplace(tmp, '-', '_', [rfReplaceAll]);
tmp := 'HTTP_' + tmp;
result := AnsiString(tmp);
end;
begin
// will work on Indy Standalone EXE
result := ARequest.GetFieldByName(AHeaderName);
if result = '' then
begin
// will work on Apache ISAPI DLL
AHeaderName := ConvertToCGIStyle(AHeaderName);
result := ARequest.GetFieldByName(AHeaderName);
end;
end;
GetHTTPHeader(ARequest, 'Accept-Language');