标题:Web Storage System + WebDAV
关键字:WebDAV
链接:http://blog.csdn.net/jrq/archive/2007/02/08/1504984.aspx
1.Web存储系统(Web Storage System):
Exchange Web 存储是一种数据库技术,可用于存储、共享和管理异类数据,如电子邮件、Web 页、多媒体文件和 Microsoft Office XP 文档。
Web 存储系统很象传统的文件系统,用文件夹层次进行组织。
Web 存储系统中的每个文件夹可包含任意数目的项,包括其它文件夹。
可以使用许多协议和应用程序编程接口 (API)(包括超文本传输协议 (HTTP) 和 WebDAV (HTTP/WebDAV)、Microsoft ActiveX 数据对象版本 2.5 (ADO)、OLE DB 版本 2.5、Exchange 2000 协作数据对象 (CDOEX)、消息处理 API (MAPI))通过文件系统并使用多种其他工业标准的有线协议来访问 Web 存储系统中的项。
Web 存储系统提供一个储备库,在一个基础结构中管理电子邮件、文档、Web 页和其他资源,从而将知识源集成在一起。
Web 存储系统支持远程客户端访问,并支持一些 API。此外,Web 存储系统还充当统一消息传递平台,知识工作者可以在此访问私人信息,如日历、联系人以电子邮件和语音邮件。
Web 存储系统在以下三个主要方面提供基于企业的应用程序服务:
常见的客户端访问 — 客户端(如 Office)可以读写文档,并可存储流数据(如音频和视频)。Web 存储系统包括支持层次集合(文件夹)以及异类集合(可接受任何文件类型的文件夹)的数据模型。
下一代数据库 — Web 存储系统提供了下一代的数据库服务,它可以将多种类型的信息存储在一个储备库中。包含在 Web 存储系统数据库中的信息,可以是不同类型的数据,如从 OLE DB 和 ActiveX 数据对象 (ADO) 记录集到 MIME 邮件和可扩展标记语言 (XML) 数据等。Web 存储系统还提供诸如原子更新等数据库服务。如果更新涉及到 Web 存储系统中的多个项,则这些服务为最终用户显示一致的视图。
丰富的开发平台 — Web 存储系统支持消息传递、联系人、日历、工作流以及组和实时协作。
2.WebDAV
分布式创作和版本管理,用于访问 Microsoft Web 存储系统中项目的协议。它提供了一种方法,既能访问项目内容,又能访问扩展的相关属性集。也称为 HTTP/WebDAV 协议。
3.使用 Web 存储系统资源管理器:
3.1.单击“开始”按钮,指向“程序”、“Web Storage System SDK”,然后指向“Web Storage System Tools”。
3.2.单击“Web Storage System Explorer”,打开 WSS 资源管理器。
3.3.在“Authorization”对话框中,输入您的用户名、密码,使用具有适当权限的帐户证书,并以 http://<yourserver>/public 的形式指定 URL。
3.4.WSS 资源管理器将启动。
4.D7中WebDAV的操作代码示例:
var WebPath,WebDomain,WebUser,PassWord:String;
uses ComObj;
procedure WriteLog(const LogStr:String);
var F:TextFile;
begin
if LogStr<>'' then //写日志文件
begin
AssignFile(F,ExtractFilePath(ParamStr(0))+'Log/Message'+FormatDateTime('yyyy-mm-dd',now)+'.log');
if not FileExists(ExtractFilePath(ParamStr(0))+'Log/Message'+FormatDateTime('yyyy-mm-dd',now)+'.log') then
begin
ReWrite(F); //为写创建一个新文件;
Writeln(F,'['+FormatDateTime('yyyy-mm-dd hh:mm:ss',now)+']: '+ LogStr);
CloseFile(F);
end
else
begin
Append(F);
if LogStr=' ' then
Writeln(F,'')
else
Writeln(F,'['+FormatDateTime('yyyy-mm-dd hh:mm:ss',now)+']: '+ LogStr);
CloseFile(F);
end;
end;
end;
procedure AddChild(XMLDOM, TagName, NameSpace, NodeValue,
ndlevel: variant);
var objChildNode,objParentNode:Variant;
i:Integer;
begin
objChildNode:=xmldom.createNode(1,TagName,NameSpace);
objChildNode.text:=nodevalue;
if ((XMLDOM.HasChildNodes) and (ndlevel>1)) then
begin
objParentNode := xmlDom.LastChild;
for i:=0 to ndlevel-3 do
if (objParentNode.hasChildNodes) then
objParentNode := objParentNode.LastChild;
objParentNode.AppendChild(objChildNode);
end
else
begin
XMLDOM.AppendChild(objChildNode);
end;
objParentNode := null;
objChildNode :=null;
end;
procedure SaveFieldUsingWebDAV(MessageUrl, FieldName, NameSpace,
FieldValue: variant);
var aXMLDOC,aXMLHTTP:Variant;
begin
aXMLHTTP:=CreateOleObject('MSXML2.XMLHTTP.3.0');
aXMLDOC:= CreateOleObject('MSXML2.DOMDocument.3.0');
AddChild(aXMLDOC,'d:propertyupdate','DAV:','',1);
AddChild(aXMLDOC,'d:set','DAV:','',2);
AddChild(aXMLDOC,'d:prop','DAV:','',3);
AddChild(aXMLDOC,FieldName,NameSpace,FieldValue,4);
aXMLHTTP.open('PROPPATCH',MessageUrl, False,WebDomain+'/'+WebUser,PassWord);
aXMLHTTP.setRequestHeader('Content-Type','text/xml; charset=''UTF-8''');
aXMLHTTP.setRequestHeader('Overwrite','t');
aXMLHTTP.setRequestHeader('Translate','f');
//aXMLDOC.save(ExtractFilePath(ParamStr(0))+'c.xml');
aXMLHTTP.send(aXMLDOC);
aXMLHTTP:=null;
aXMLDOC:=null;
end;
procedure SetMessageProperty(MessageUrl, NameSpace, TagName,
Value, Domain, UserName, PassWord: variant);
var XMLHttp,strWebDav:variant;
aStr:string;
begin
XMLHttp:=CreateOleObject('MSXML2.XMLHTTP.3.0');
strWebDav:='';
if ((namespace='DAV') or (namespace='DAV:')) then
begin
strWebDav := strWebDav+'<d:propertyupdate xmlns:d=''DAV:''>';
strWebDav := strWebDav+'<d:set>';
strWebDav := strWebDav+'<d:prop>';
strWebDav := strWebDav+'<d:' + TagName + '>' + Value + '</d:' + TagName + '>';
strWebDav := strWebDav+'</d:prop>';
strWebDav := strWebDav+'</d:set>';
strWebDav := strWebDav+'</d:propertyupdate>';
end
else
begin
strWebDav := strWebDav+'<d:propertyupdate xmlns:d=''DAV:'' xmlns:m="' + NameSpace + '">';
strWebDav := strWebDav+'<d:set>';
strWebDav := strWebDav+'<d:prop>';
strWebDav := strWebDav+'<m:' + TagName + '>' + Value + '</m:' + TagName + '>';
strWebDav := strWebDav+'</d:prop>';
strWebDav := strWebDav+'</d:set>';
strWebDav := strWebDav+'</d:propertyupdate>';
end;
aStr:=MessageUrl;
XMLHttp.open('PROPPATCH',astr,false,WebDomain+'/'+WebUser,PassWord);
XMLHttp.setRequestHeader('Content-Type','text/xml; charset=''UTF-8''');
XMLHttp.setRequestHeader('Translate','f');
//WriteLog(strWebDav);
XMLHttp.send(strWebDav);
end;
procedure TForm1.Button1Click(Sender: TObject);
var Count,i,j:integer;
XMLHttp,XMLDOC,XMLNode,WebDav:Variant;
WebSQL:WideString;
CurrentFlow,GDName,GDBZ,tmpStr:String;
FlowList:TStringList;
begin
XMLHttp:=CreateOleObject('MSXML2.XMLHTTP.3.0');
XMLDOC:= CreateOleObject('MSXML2.DOMDocument.3.0');
WebPath:='http://ex01/public/工作流程/'; //ExChange服务地址
WebDomain:='Hebmc.com'; //域
WebUser:='OAWebUser'; //域账户
PassWord:='chenzuooaup02'; //域账户密码
GDName:='HASTOTHAMS20070112'; //标记
GDBZ:='TRUE'; //标记值
//使用WebDav的查询语句。
WebSQL:='select "DAV:displayname" From "'+WebPath+'" where (("DAV:contentclass"=''urn:content-classes:folder'') or ("DAV:contentclass"=''urn:content-classes:mailfolder''))';
WebDav:='<D:searchrequest xmlns:D="DAV:"> <D:sql> '+WebSQL+' </D:sql> </D:searchrequest>';
{
WebDav:='<D:searchrequest xmlns:D="DAV:"> <D:sql> select "DAV:displayname" From "http://ex01/public/工作流程/" where (("DAV:contentclass"=''urn:content-classes:folder'') or ("DAV:contentclass"=''urn:content-classes:mailfolder'')) </D:sql> </D:searchrequest>';
}
//查找系统中所有的流程名称
try
XMLHttp.open('SEARCH',WebPath,False,WebDomain+'/'+WebUser,PassWord);
XMLHttp.setRequestHeader('Content-Type','text/xml; charset=''UTF-8''');
XMLHttp.setRequestHeader('depth','0');
XMLHttp.setRequestHeader('Translate','f');
XMLHttp.send(WebDav); //WebDAV查询
XMLDOC.Load(XMLHttp.responseXML); //得到返回值
//XMLDOC.save(ExtractFilePath(ParamStr(0))+'a.xml');
//得到系统中所有的流程名称
XMLNode:=XMLDOC.DocumentElement.SelectNodes('a:response/a:propstat/a:prop');
except on e:Exception do
WriteLog(e.Message);
end;
FlowList:=TStringList.Create;
//添加流程名称到List中
for Count:=0 to XMLNode.Length-1 do
FlowList.Add(XMLNode.Item[Count].ChildNodes(0).Text);
//流程循环
for Count:=0 to FlowList.Count-1 do
begin
CurrentFlow:=Trim(FlowList[Count]);
WebSQL:=' select "DAV:href","拷贝ID","DAV:displayname","发件编号$$","密级$$","主办部门$$","主题词$$","收文机关$$","发文公司$$","来文机关$$" '+
' from "'+WebPath+CurrentFlow+'/已办理信文'+'" '+
' where ((("DAV:contentclass"=''urn:content-classes:message'')) and (("'+GDName+'" is null) or ("'+GDName+'"!='''+GDBZ+''')) and (("KDBZ" is null) or ("KDBZ"=''N'')))';
WebDav:='<D:searchrequest xmlns:D="DAV:"> <D:sql> '+WebSQL+' </D:sql> </D:searchrequest>';
try
XMLHttp.Open('SEARCH',WebPath,False,WebDomain+'/'+WebUser,PassWord); //WebDav查找
except on e:Exception do
WriteLog(e.Message);
end;
try
XMLHttp.setRequestHeader('Content-Type','text/xml; charset=''UTF-8''');
XMLHttp.setRequestHeader('depth','0');
XMLHttp.setRequestHeader('Translate','f');
XMLHttp.Send(WebDav);
XMLDOC.Load(XMLHttp.responseXML);
//XMLDOC.save(ExtractFilePath(ParamStr(0))+'b.xml');
//得到某流程中的所有的条目节点。
XMLNode:=XMLDOC.documentElement.selectNodes('a:response/a:propstat/a:prop');
except on e:Exception do
WriteLog(e.Message);
end;
//该条目节点内的属性(子节点)循环
for i:=0 to XMLNode.Length-1 do
begin
for j:=0 to XMLNode.Item[i].ChildNodes.Length-1 do
begin
tmpStr:=XMLNode.Item[i].ChildNodes(j).Text; //得到属性的内容
//此处可以对tmpStr做其他操作,如保存到数据库。
end; //for j:=0
//该条目节点处理完毕后,写入已经处理的标记。
try
SetMessageProperty(XMLNode.Item[i].ChildNodes(0).Text,'',GDName,GDBZ,WebDomain,WebUser,PassWord);
except on e:Exception do
begin
WriteLog(e.Message);
Continue;
end;
end;
try
SaveFieldUsingWebDAV(XMLNode.Item[i].ChildNodes(0).Text,GDName,'',GDBZ);
except on e:Exception do
begin
WriteLog(e.Message);
Continue;
end;
end;
end; //for i:=0 to XMLNode.Length-1 do
end; //for Count:=0 to FlowList.Count-1 do
FreeAndNil(FlowList);
XMLNode:=null;
XMLDOC:=null;
XMLHttp:=null;
end;
end.
5.参考:
http://www.microsoft.com/china/MSDN/library/archives/library/techart/wssformsreg_v4.asp
by jrq
2007/02/07 雪 于石·移动