у меня что-то странное в моем приложении. Интересно, что я сделал не так или чего не понял.
Цель состоит в том, чтобы создать 2 функции в ServerMethodsUnit для изменения переменной веб-модуля.
Для этого,
Я использовал мастер Datasnap Rest Server со следующими параметрами
Автономное приложение VCL Gui Без авторизации, из Tdatamodule Методы сервера EchoString и ReverseString работают хорошо.
Сначала я добавил в WebModuleUnit1 переменную var1: string;
TWebModule1 = class(TWebModule)
DSHTTPWebDispatcher1: TDSHTTPWebDispatcher;
DSServer1: TDSServer;
DSServerClass1: TDSServerClass;
ServerFunctionInvoker: TPageProducer;
ReverseString: TPageProducer;
WebFileDispatcher1: TWebFileDispatcher;
DSProxyGenerator1: TDSProxyGenerator;
DSServerMetaDataProvider1: TDSServerMetaDataProvider;
procedure DSServerClass1GetClass(DSServerClass: TDSServerClass;
var PersistentClass: TPersistentClass);
procedure ServerFunctionInvokerHTMLTag(Sender: TObject; Tag: TTag;
const TagString: string; TagParams: TStrings; var ReplaceText: string);
procedure WebModuleDefaultAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure WebModuleBeforeDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure WebFileDispatcher1BeforeDispatch(Sender: TObject;
const AFileName: string; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
procedure WebModuleCreate(Sender: TObject);
private
{ Déclarations privées }
FServerFunctionInvokerAction: TWebActionItem;
function AllowServerFunctionInvoker: Boolean;
public
{ Déclarations publiques }
var1:string;
end;
Я добавил в ServerMethodsUnit1 2 функции в ServerMethodsUnit1
функция SetVar1 (астр: строка): строка; функция GetVar1 (): строка;
и использование Datasnap.DSHTTPWebBroker (интерфейс) и WebModuleUnit1 (реализация)
function TServerMethods1.GetVar1: string;
var oweb : TWebModule1;
begin
oweb := TWebModule1(GetDataSnapWebModule);
result := oweb.var1;
end;
function TServerMethods1.SetVar1(astr: string): string;
var oweb : TWebModule1;
begin
oweb := TWebModule1(GetDataSnapWebModule);
oweb.var1 := astr;
result := oweb.var1;
end;
все казалось нормально!
Я тестирую свои 2 функции с помощью http: // локальный: xxxx / ServerFunctionInvoker
Все работает нормально, когда у меня только одно соединение с моим веб-сервером.
Когда у меня несколько подключений, это больше не работает. У меня сложилось впечатление, что переменная используется разными экземплярами WebModule.
Пример :
Instance 1 (Chrome) -> SetVar1('TOTO')
Instance 2 (Firefox) -> SetVar1('HELLO')
Instance 1 (Chrome) -> GetVar1 : return 'TOTO'
Instance 1 (Chrome) -> GetVar1 : return 'HELLO'
Instance 1 (Chrome) -> GetVar1 : return ''
Если я запускаю одну и ту же функцию 3 раза, у меня не будет одинакового ответа !!!
Это как если бы функция GetDataSnapWebModule не вернула правильный веб-модуль.
Что я сделал не так?
Как разделить переменную (или TfdmemTable) между двумя вызовами функции rest
Спасибо заранее за вашу помощь.
@ + Ромуальд
да, есть несколько экземпляров, но когда я многократно запускаю одну и ту же функцию rest (Getvar1) в одном и том же экземпляре, я не получаю тот же результат. Альтернативой было бы знать, как обмениваться данными между несколькими функциями отдыха. Где мне сохранить эти данные? Спасибо заранее за вашу помощь. @ + Ромуальд
Вы можете записывать и читать общие данные из базы данных или из файла любым из ваших серверных методов.





Когда одновременно обслуживается более одного запроса / вызова, может быть несколько экземпляров вашего TWebModule.