在我的Delphi 10.3.1应用程序服务器(这是一个“ DataSnap REST应用程序”)中,我进行了一些记录,如下所示:
procedure TWebModule1.DSAuthenticationManager1UserAuthenticate(
Sender: TObject; const Protocol, Context, User, Password: string;
var valid: Boolean; UserRoles: TStrings);
begin
valid := (User > '') and (Password > ''); // pass-through
if Valid then
begin
MyWebUtils.LogMessage('Authentication, ' + User + ', ' + Password +
', ' + protocol + ', ' + context);
TDSSessionManager.GetThreadSession.PutData('USERNAME', User);
end;
end;
在使用dsRestConnection的客户端(在Android上)中,我有一个测试连接的过程,例如在主窗体的FormShow中。
function TClientModuleRest.TestConnect(var ErrorMsg: String): Boolean;
var
returned: String;
begin
Result := True;
try
DSRestConnection.Username := 'Admin';
DSRestConnection.Password := 'Test';
DSRestConnection.TestConnection([toNoLoginPrompt]);
except
on e: exception do
begin
Result := False;
ErrorMsg := e.Message;
end
end;
end;
这很好。
当我调用第一个Server方法时,会出现问题。
function TClientModuleRest.ValidUser(username, password: String;
var Response: String): Integer;
var
Server: TServerMethodsRClient;
Valid: Boolean;
IniFile: TStringList;
FileName: TFileName;
begin
Result := 0;
DSRestConnection.UserName := username;
DSRestConnection.Password := password;
try
Server := TServerMethodsRClient.Create(DSRestConnection);
try
Valid := Server.ValidUser(username, password, Response);
if not Valid then
raise Exception.Create(response);
Result := 1;
finally
Server.Free;
end;
except
on e: exception do
begin
Response := e.Message;
Result := -1; // an error occured
end;
end;
end;
所以问题在于.username
和.password
的设置没有被“接受”。换句话说,我的结论是.username
和`.password只能在第一次连接之前设置 ,而不能在之后设置。
服务器日志文件显示,即使使用传递给它的用户名和密码值调用了ValidUser函数,验证仍从第一个(测试)连接接收用户名和密码。
这是设计使然吗?还是我错过了什么?谢谢。