[转载红鱼儿]kbmmw 开发点滴:kbmMW默认服务

简介: 这两天,用xalion的入门文章学习kbmMW的使用,当用kbmMW向导生成一个Service后,需要注册到kbmMWServer中,具体的方法在生成的Service中已经有说明: // INSTRUCTIONS FOR REGISTRATION/USAGE // ---------------...

这两天,用xalion的入门文章学习kbmMW的使用,当用kbmMW向导生成一个Service后,需要注册到kbmMWServer中,具体的方法在生成的Service中已经有说明:

// INSTRUCTIONS FOR REGISTRATION/USAGE
// -----------------------------------
// Please update the uses clause of the datamodule/form the TkbmMWServer is placed on by adding
// YourServiceUnitName to it. Eg.
//
// uses ...,kbmMWServer,YourServiceUnitName;
//
// Somewhere in your application, make sure to register the serviceclass to the TkbmMWServer instance. Eg.
//
// var
// sd:TkbmMWCustomServiceDefinition;
// ..
// sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);
//
// Set the last parameter to true if this is the default service.
//

参考上面的说明代码,就是利用kbmMWServer的RegisterService注册即可,其中有两个参数

第一个参数是Service的类名,这个参数很好理解,要注册的Service类是什么,拿来用即可,当然,别忘记use对应的Service单元。

第二个参数为Boolean变量,意思是说将这个Service注册为默认的服务。我想,进一步理解,就是客户端在向服务请求具体功能函数时,不用加Service名,如下面这行代码的调用:

edit2.Text:=kbmmwSimpleClient1.Request('TESTSERVICES','1.0','SUMNUM1',args);

可以写成省略Serviceq名的,以简化调用,但做了如下的动改后,无法调用,提示说找不到服务。

edit2.Text:=kbmmwSimpleClient1.Request('','','SUMNUM1',args);

明明已经把要调用的服务注册成默认服务了,看来,不能这样用,或者这样理解。于是,进一步查看kbmMWSimpleClient还有哪些调用服务的方法,一路追到TkbmMWCustomClient这个类,还真不少方法,但大部分调用服务的方法第一个参数都是AServiceName.

function SendPing:variant; overload; virtual;
function SendPing(const AValue:variant):variant; overload; virtual;
procedure AddStateID(AServiceName,AServiceVersion:string; AStateID:integer);
function SendRequest(AServiceName,AServiceVersion:string; AFunc:string; const Args:array of Variant):Variant; virtual;
function SendRequestEx(AServiceName,AServiceVersion:string; AStateID:integer; AFunc:string; const Args:array of Variant):Variant; virtual;
function SendAsyncRequest(AServiceName,AServiceVersion:string; AFunc:string; const Args:array of Variant):longint; virtual;
function SendAsyncRequestEx(AServiceName,AServiceVersion:string; AStateID:integer; AFunc:string; const Args:array of Variant):longint; virtual;
procedure SendCall(AServiceName,AServiceVersion:string; AFunc:string; const Args:array of Variant); virtual;

不明白了,上面这些TkbmMWCustomClient类的方法,只有SendPing没有AServiceName参数。(还不知SendPing是干什么的),如此的话,把一个服务注册成默认Service,有什么用呢?

百思不得其解,于是向Xalion请教。他帮我修改了我做的学习代码,学习后才明白。原来,kwmMW作者在kbmmw中实现了一些服务(一些,目前只知道xalion帮我写的),可以拿来直接注册到kbmMWServer中,以供客户端调用。如:TkbmMWInventoryService,这个是从TkbmMWSimpleService继承来的Service,象注册自己做的Service一样。

procedure TForm4.FormCreate(Sender: TObject);
var
sd:TkbmMWCustomServiceDefinition;
begin
sd:=kbmMWServer1.RegisterService(TkbmMWInventoryService,True);
sd:=kbmMWServer1.RegisterService(TkbmMWSimpleService1,False);
sd:=kbmMWServer1.RegisterService(TkbmMWQueryService2,False);
end;

在客户端这样调用:

放一个对应的TkbmMWInventoryClient,并设置好Transport属性值,然后就可以象kbmMWSimpleClient一样向服务器发送请求了。

如:

kbmMWInventoryClient1.Refresh;

memo1.Lines.Add(kbmMWInventoryClient1.Inventory.Text);

调用后,在memo中会看到列出了Server注册的所有服务名。

这就是kbmMW默认服务的目的?现在想是这样。

另:可以将多个Service都注册为默认服务吗?经测试,在一个kbmMWServer中只能注册一个Service为默认服务。

上面提到的kbmMWInventoryService,具估还有哪功能,看来还得花时间学习他的代码了,再续。

目录
相关文章
|
数据库 关系型数据库 MySQL
清幽傲竹实现的kbmMWServer数据库联接失败重联(转载红鱼儿)
1。修改kbmMWUnidac单元的TkbmMWUNIDACConnection.InternalOpenConnection方法,加上:            //支持unidac重联           FDatabase.
946 0
|
数据库
unidac 6.0.1 与kbmmw 的一点小摩擦
unidac 6.0.1  出来了,虽然支持sql server 直连等新特性,但是由于内部改动比较大, 导致与kmmmw 的集成起来存在有点小问题,就是如果数据库不是interbase 或者firebird 的话, 客户端访问kbmmw会出现"InterBase provider is not registered.
977 0
|
JSON 数据格式 数据库
[转载红鱼儿]kbmmw 开发点滴:kbmMW:Unknown property:indexes
利用kbmMW的QueryServices,对数据集进行提交,当改用JSON格式时,客户端提交时,会产生这个错误,明明已经更新数据库,也产生这个错误!如果换成Bin格式,则正常。 能过查看kbmMWJSONStreamFormat单元,问题产生在这行代码:nIndexDefs:=nDefs.AsArray['indexes']; 可以这样理解: 客户端提交数据后,服务器会返回一个错误结果数据集,不管有无错误,都要返回这个结果集。
900 0
|
数据处理
[转载红鱼儿]kbmmw 开发点滴:kbmmW服务端事务控制
关于kbmMW的事务控制,前文已经在客户端实现,通过kbmMWClientTransaction来控制多个数据集的提交,在客户端提交多数据集,实际上,是在客户端实现业务逻辑,并通过一个事务来完成数据处理,这是违反多层架构的做法,实际项目中,需要在服务端,往往是利用多个数据集进行业务处理,并且用事务来控制,那我们该怎么办呢?换句话说,如何在服务实现事务的控制。
784 0
|
SQL 数据库
[转载红鱼儿]kbmmw 开发点滴:kbmMWQuery插入记录
想利用TkbmMWUNIDACQuery插入一条记录,结果遇到问题,显示: 不允许从数据类型 sql_variant 到 varchar 的隐式转换。请使用 CONVERT 函数来运行此查询。这是什么问题啊?下面是出问题的代码,很常规的写法。
869 0
|
安全
[转载红鱼儿]kbmmw 开发点滴:TkbmMWLock用法
TStringList不是线程安全的,当我们在线程用到他是,要做保护。方法有两种,一种是用delphi自带的Critical,另外一种就是kbmMW为我们提供的TkbmMWLock类。 现在我们看看如何用TkbmMWLock为TStringList做线程安全: 1.
1074 0
|
SQL 应用服务中间件 数据库
[转载红鱼儿]kbmmw 开发点滴:kbmMW数据集流化
kbmMW提供了QueryService,供我们在客户端象传统数据库应用一样,直接利用ClientQuery做SQL查询,以及提交,并且能够在客 户端以事务的方式提交多个数据集,应该说,QueryService为我们提供了非常好的便利,快速将两层应用转为多层应用,如果用过ASTA,就会发 现,QueryService在对两层应用的转化上,要比其实现的更完美,层次更清晰。
990 0
|
SQL 缓存
[转载红鱼儿]kbmmw 开发点滴:kbmMW缓存机制
kbmMW提供了稳顾机制,分为服务端的Cache及客户端的Cache。以客户端为例,当客户端发出相同的数据查询请求时,kbmMW会在客户端的Cache中查找,如果找到,则不再向服务器请求数据。 为了启用一个ClientQuery使用稳存,首先要设置其以下两个属性: kbmMWClientQuery.
841 0
|
自然语言处理
[转载红鱼儿]kbmmw 开发点滴:Authorization failed.
开始利用kbmmw实作项目,第一件事就是为的服务端加用户的认证。如果客户端发来的请求无法在服务器端通过认证,即客户端认证失败,会在客户端弹出一个错误提示窗口:Authorization failed.总不能让用户看到这样的提示信息,得想办法,截获这样的错误,并给出自己的提示。
799 0