摩托做了一点关于webservice 关于 header 控制的最简单例子
有如下几种情况:
server client
.net delphi
delphi .net
delphi delphi
.net .net谁想看看,说话,不过以后要常来midas板块哦!( :P 摩托可不是讲条件哦 ^_^)
有如下几种情况:
server client
.net delphi
delphi .net
delphi delphi
.net .net谁想看看,说话,不过以后要常来midas板块哦!( :P 摩托可不是讲条件哦 ^_^)
解决方案 »
- 无聊的代码注释问题
- delphi2006中如何添加VCL控件
- 求delphi开发人员...
- 继续求救:如何向access表中添加一列数据?
- 如何给数组控件添加事件响应?
- 求delphi6.0开发实务 迟忠先 电子工业出版社 电子书 哪有下载?
- 怎样使任务拦能显示多个已打开的窗口。
- delphi数据库控件简单问题,100分送上!!!
- 急,我用delphi做了一个聊天工具的,当客户端出现一起登陆时,服务器响应连接超时,然后就出现死机,关不掉
- 关于DELPHI TWebBrowser获取动态验证码GIF图片
- infopower 2000与infopower 3000?请高手和版主帮我解答
- access中提取一个字段的子串是哪个函数?
。net server:public class Authentication: System.Web.Services.Protocols.SoapHeader
{ public string Username; public string Password; public Boolean ValidUser(string in_Username, string in_Password)
{
if ((in_Password=="password") && (in_Username=="username" ))
{
return true;
}
else
{
return false;
}
}
public Authentication() { }
} public class header : System.Web.Services.WebService
{
public header()
{
//CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的
InitializeComponent();
} #region Component Designer generated code
//Web 服务设计器所必需的
private IContainer components = null;
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
} /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion // WEB 服务示例
// HelloWorld() 示例服务返回字符串 Hello World
// 若要生成,请取消注释下列行,然后保存并生成项目
// 若要测试此 Web 服务,请按 F5 键 public Authentication headersoap;
[WebMethod]
[System.Web.Services.Protocols.SoapHeader("headersoap")]
public string HelloWorld()
{
if (headersoap.ValidUser(headersoap.Username,headersoap.Password))
return "Hello World";
else
return null;
}
}
delphi client:procedure TForm1.Button1Click(Sender: TObject);
var
h:AuthHeader ;
s:string;
begin
try
h:=AuthHeader.Create ;
h.Password :=edit2.Text ;
h.Username :=edit1.Text ;
HTTPRIO1.SOAPHeaders.Send(h);
s:=(HTTPRIO1 as IDheadtest).hellodelphi;
if s<>'' then
showmessage(s)
else
showmessage('用户名或者密码错误!');
finally
freeandnil(h); end;
end;代码不少,基本的就这意思,很简单!
要的留个邮箱!
[email protected]
而且这本书上的内容全是别人的,作者好像就没有自己写代码;
大家能不买这本书就最好别买,因为好多内容都是网上的,而且一些问题只是提出,根本没有解决方案!
//****************************************************************//
// Pool Code(池子代码)
作 者: 小小
// 调试时间:2002-10-31 15:41
// 调试环境:Windows 2000 + Delphi6.0;
// 交流地点:www.nxit.net/bbs or www.nxit.net/bbs
//**********************************************************//
unit ServerS_Unit;interface
uses
ComObj, ActiveX, ServerS_TLB, Classes, SyncObjs, Windows;/////单元引用;
type TPoolS = Class(TAutoObject,IPooler_LX)//接口的实现,前边说COM and DCOM曾说过;
Private
Function GetInterface : IPooler_LX; //获得一个接口,进而获得对像;
Procedure SetInterface(InterfaceValue : IPooler_LX);//释放一个接口,是放回去;
Function GetLock(Index : Integer) : Boolean;
Procedure ReleaseLock(Index : Integer;Var InterfaceValue : IPooler_LX);
Protected
{ IAppServer }
{**************************************************************************}
{在Protected里边,所有的声明都是基于IppAerver接口的,如计数加1,获得接口, }
{ 释放接口操作,而且还引用了协调接口类 }
{**************************************************************************}
function AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant;
MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; safecall;
function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer;
Options: Integer; const CommandText: WideString;
var Params: OleVariant; var OwnerData: OleVariant): OleVariant; safecall;
function AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; safecall;
function AS_GetProviderNames: OleVariant; safecall;
function AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; safecall;
function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer;
var OwnerData: OleVariant): OleVariant; safecall;
procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString;
var Params: OleVariant; var OwnerData: OleVariant); safecall;
end; TPoolManager = Class(TObject)///定义一个管理接口对像类,必不可少,不然无法管理
Private
FMaxCount : Integer;////最大连接数;
FTimeOut : Integer;////连接超时;
FCriticalSectionS : TCriticalSection;////可以理解为进行协调;
FHandle : THandle ;
FRDMList:TList;
/////////////Function GetLock(Index : Integer) : Boolean;
///////////////////Procedure RePlease(Index : Integer ; InterfaceValue : IPooler_LX);
Function CreateNewInstance : IPooler_LX;
Public
Constructor Create;
Destructor Destroy;Override;
Function GetInterface : IPooler_LX; //获得一个接口,进而获得对像;
Procedure SetInterface(InterfaceValue : IPooler_LX);//释放一个接口,是放回去; s Property TimeOut : Integer read FTimeOut;
Property MaxCount : Integer read FMaxCOunt;
end; PRDM = ^TRDM;
TRDM = Record
InValue : IPooler_LX;
InUser : Boolean;
end;var
PoolManager : TPoolManager;
implementation
uses
ComServ, SysUtils , SRDMUnit;{ TPoolManager }constructor TPoolManager.Create;
begin
FRDMList := TList.Create;
FCriticalSectionS := TCriticalSection.Create;
FTimeOut := 1000;
FMaxCount := 5;
FHandle := CreateSemaphore(Nil,FTimeOut,FMaxCount,Nil);
end;
{******************************************************************************}
{ CriticalSection是指一段程序码,同一时间只能有一个Thread执行它,此VCL包装了 }
{ Win32API中关於CriticalSection的4个函数InitializeCriticalSection、 }
{ EnterCriticalSection、LeaveCriticalSection及DeleteCriticalSection) }
{ }
{ Win 32 API提供了一组同步对象,如:信号灯(Semaphore)、互斥(Mutex)、 }
{ 临界区(CriticalSection)和事件(Event)等,用来解决这个问题 }
{******************************************************************************}
{******************************************************************************}
{ TPoolManager.Create是为远程数据模快创建一个缓冲池,并且进行了规定,禄始化 }
{ }
{ }
{ }
{ }
{ }
{******************************************************************************}
function TPoolManager.CreateNewInstance: IPooler_LX;
var
PValue : PRDM;
begin
FCriticalSectionS.Enter;
Try
New(PValue);
PValue.InValue := RDMFactory.CreateComObject(Nil) as IPooler_LX;//类工厂的应用
PValue.InUser := True;//置为可用;
FRDMList.Add(PValue);
Result := PValue.InValue;
Finally
FCriticalSectionS.Leave;
end;
end;destructor TPoolManager.Destroy;
var
I : Integer;
begin
FCriticalSectionS.Free;
for I := 0 to FRDMList.Count - 1 do
begin
PRDM(FRDMList[I]).InValue := Nil;
//////////PRDM(FRDMList[I]).InUser := False;
FreeMem(PRDM(FRDMList[I])); //////释放了PRDM资源;
end;
FRDMList.Free;
CloseHandle(FHandle);
inherited Destroy;
end;function TPoolManager.GetInterface: IPooler_LX; //// 获得连接;
var
I : Integer;
begin
Result := False;
if WaitForSingleObject(FHandle,TimeOut) = WAIT_FAILED then
Raise Exception.Create('对不起,没有成功获得资源');
for I := 0 to FRDMList.Count - 1 do
begin
if GetLock(I) then
begin
Result := PRDM(FRDMList[I]).InValue;///判断是否有可用的资源可以利用,或接口
Exit;
end;
end;
if FRDMList.Count < MaxCount then
Resule := CreateNewInstance;///新建资源
if Result = Nil then
Raise Exception.Create('对不起,不能获得资源');
end;
{******************************************************************************}
{ WaitForSingleObject()说明: }
{ WaitForSingleObject(ByVal hHandle As Long, }
{ ByVal dwMilliseconds As Long); }
{ hHandle:等待对象的句柄; }
{ dwMilliseconds:等待时间。 }
{ 该函数可以实现对一个可等待对象的等待操作,获取操作执行权。当等待的对象被释放时}
{ 函数成功返回,同时使等待对象变为有信号状态,或者超时返回。该函数用于等待 }
{ Semaphore信号时,若Semaphore信号不为0,则函数成功返回,同时使Semaphore信号记 }
{ 数减1。我们可以利用它建立一个记数信号,每次当相同的程序加载时使记数器减1,退 }
{ 出的时候使计数器加1,这样就可以限制相同程序的多份拷贝同时运行。 }
{******************************************************************************}
function TPoolManager.GetLock(Index: Integer): Boolean;
begin
FCriticalSectionS.Enter;///进锁
Try
Result := Not PRDM(FRDMList[Index]).InUser;//是否可用,是否可以获得连接;
if Not Result then
PRDM(FRDMList[Index]).InUser := True;//置连接为不在可用(对于其它用户而言)
Finally
FCriticalSectionS.Leave;
end;
end;procedure TPoolManager.RePlease(Index: Integer;
InterfaceValue: IPooler_LX);
begin
FCritiCalSectionS.Enter;
Try
PRDM(FRDMList[Index]).InUser := False;
InterfaceValue := Nil;
ReleaseSemaphore(FHandle,1,Nil);
Finally
FCritiCalSectionS.Leave;
end;
end;procedure TPoolManager.SetInterface(InterfaceValue: IPooler_LX);
var
I : Integer;
begin
for I := 0 to FRDMList.Count do
begin
if InterfaceValu
小小原创
提高分布式多层系统的效率是一个永远不变的主题,有很多制约分布式系统的效率,如:RDBMS、数据库引擎、代码效率、各种Pooling、开发设计等……
在此,我就Pooler说一说,希望对大家有用;
有那些Pooler?Pooler是什么?那儿可以用Pooler?Pooler有什么用?怎么用Pooler?当一系例的Pooler问题摆在你的面前时,你如何下手?从那儿下手?但这些又是我们不得不面对的待解决的问题;唯一的办法只能是理解、解决它些问题;
Pooler是池子的意思,可以这样理解,无论是那种Pooler,它都为用户提供了一个相当于容器的作用的连接,比如一个用户可能需要连接远程数据库中特定的表,当他花费了一定时间进行连接、使用完毕之后,他是要释放这个连接呢?还是将这个连接放在某一个容器里边呢?不可否认,在多层中,连接操作是一个费时操作,特别是对于大型数据库,要进行各种检查等操作,那么,是不是每一个用户都需要这个步骤呢?这儿就提到了Pooler这个概念;当用户A将操作都执行完毕之后,他如果释放了他的连接,那么这个连接就只是被用户A一个人用过,其它用户没有机会再次用这个连接,还要继续进行连接操作,继续的浪费时间;而如果用户A能将这个连接保存下来,供以后可以用的着这个连接的用户使用的话,岂不是很好吗?此是Pooler就充当了这个角色,所以,我们可以将Pooler在这儿理解成存放连接的池子或容器;
Pooler又可以分为那些?分类所然没有被完全的规格化,但是可以将它罗列出来对我们有用的一些,比如: Session Pooling,Object Pooling,Connection Pooling(前边我们说过),ResourcePooling,DataPooling等,每种不同的Pooling有不同的作用,但它们实现的功能大至相同,它们可以提供方便的连接以节省用户时间,而且可以用我们曾说过的COM or DCOM的TimeOut来判断用户是否超时等;
只要有三层的地方,都应该用Pooling,甚至在C/S里也提倡用Pooling,Connection Pooling就是最好的例子;当然,需要合理的应用Pooling,不然会造成接口混乱等现象;
Pooler 有什么作用?在说什么是Pooler时,我们已经可以感觉的出来它的作用了;那么如何用Pooler呢?提到如何用Pooler时,我想大家如果有时间应该看一看我关边的关于COM DCOM方面的介绍,因为用Pooler 或者叫pooling就必须要用到接口,而前边我曾对接口给过很详细的说明,如果你不能理解接口的话,你在这儿也将无存下手;用Pooling提高分布式系统的效率的确是一个直接的办法,特别是当用户增加时;不管是MTS or DCOM or CORBA都需要用到Pooling技术来使效率提高,我将实现原理介绍一下,后边我会对一个例子进行分析以便于我们更好的交流;一般而言,用Pooling都需要用到协调接口类CoClass(前边的贴子,我曾说过这个类);我们可以将它理解为一个类,一个实现接口的类,而Pooling就要用到它!当客户端需要数据时,那以应用程序服务器就会应用CoClass所实现的接口来和应用服务器本身的接口进行交互;而且所有连接、线程控制等操作都由你新建的CoClass所负责,之后才通过应用服务本身的接口进行数据的存取,步骤我理解是这样的:当然用户想建立某一个连接或是某一项费时操作时,而正好它现在没有和应用服务器进行通讯,这样的话,它就希望以最快的速度和应用服务器进行通讯,但步骤往往不是它直接和应用服务器进行通讯,而是它需要和CoClass的实现的接口进行作用,当这个辅助类(CoClass)给这个用户分配了线程、建立了连接等一些资源时,它才可以和应用服务进行通讯,你会不会觉的这是多此一举呢?不,应用这个辅助类可以检测是否有空闲的连接来让这个用户进行连接,是否有可用的其它资源让这个用户进行操作,这样才会正真的节省客户的时间,同时也大大的降底了服务器的担子;这便是它的作用;
而至于如何建立进程、如果分配资源,又如何回收,上边的例子可供参考;
我们来用一个例子来说;(你可以参考Delphi/Demo/Midas/Pooler这个例子 );
小小原创
COM/DCOM的前身是OLE(Object Linking and Embedding,对像连接和嵌入)是从MS的Windows3.1操作系统中发展起来的,而DCOM正真的应用是在WinNT4.0时才发挥他的优势的,一般而言(本来就是的)DCOM是COM的扩展,COM是对于单机内(物理单机)的一种应用程序互通的技术,利用它,可以很好的实现应用程序的通信,可以是线程内的通信,也可以是进程通信,如果理解它们?
客户和服务器在相同的内存处理进程中运行,并且通过使用功能调用的方法彼此通信。这种形式就是:在服务器中处理(In-Process Server);一般而言是用可以用DLL作为服务器程序的;
同时,也充许是进程内部进行通信,也就是客户端可以作用内部进程通信的方法访问服务器,而服务器可以是不同进程中运行(但,它们是在同一物理机中),这种通信方式也叫本地对像代理(Local Object Proxy);
如果此时,我们还想将COM的应用扩展开,就是网络之间的通信,这时就出现了DCOM,所以说DCOM是将COM的应用扩展到网络中,通过DCOM访问就属于远程代理对像(Remote Proxy Object)了;客户和服务器的通信合用了分布式计算环境RPC(做过分布式程序的朋友应该对RPC都比较熟悉吧,更明白的说,RPC = 远程过程调用);更精确的说,COM由两个扩展:MTS and MSMQ,他们都是通过DCOM提供的,以后会慢慢和大家交流这些的;
我们再来说一说它们之间到底有什么更密切的关系吧;
DCOM是安全的,可以这样说,之所以它比较安全就因为他是COM的扩展,继承了COM安全性这一点;
DCOM是协议无关的,而它之所以是与协议无关的,也是来源于COM,因为COM本来就是一个协议无关的组件对像模型;
DCOM是与语言无关的,因为COM就是与语言无关的,所以,DCOM或是COM组件才可以用到Delphi/VC/Java/VB……各种语言中,这也为他的进一步流通打下了基础;
………
它们之间的关系有很多,很多;
让我们用一条线串起来的话:
ActiveX - OLE - COM - DCOM;它们及是其它的基础,也是基它的增强,说一个很简单的例子,ActiveX现在用的如何?的确,它没有办法和Java组件抗衡,但是,它应用的特别的广泛这是无可置疑的,为什么?说白了,就是因为DCOM组件提供了网络连接,而ActiveX又是DCOM的一种基础,当然,他也随着DCOM改进过,所以它才可以很快的应用起来;
但是它们也是有区别的,比如COM服务器端可以是应用程序Exe文件,也可以是DLL文件,但是DCOM不允许为DLL,原因很简单,就是因为DCOM的客户端不可能保证每个进程内都有一个DLL文件的副本存在,当然,DCOM在同一机器里也可以进行通信,而且速度方面肯定很快;但它的速度如果和COM比起来,慢的可怜,应该是万分之一吧;
好了,睡觉,睡觉,不说了,有时间再说吧;
我有做广告吗?我这次可是没有啊,呵呵;
我又没有说我的坛子的地址是 www.nxit.net/bbs,我可没有说;
这就再去看看。谁让COM消我人憔悴呢,没办法哦。
我的邮箱:[email protected]
但愿不要被××功看到^_^
[email protected]
!!!!!!!!!!!
wind兄,有人说你坏话拉!!!◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
看在跟您踩同一块地的份上,以后多照顾照顾
新手,刚刚学DELPHI,多指教指教
[email protected]
多交流...
呵呵
[email protected]
[email protected]
摩托相信一句话:“经历就是财富”。不要太计较现在的蝇头小利,保持一颗
上进的心,感触周围的一切,总结而后分析。相信这种富有绝对不是鼓鼓的
钱包可以相提并论的。摩托现在也很穷,但等着吧!相信摩托不久会从两个轮子变成四个的 :)