Web Storage System + WebDAV

    技术2022-05-11  91

    标题: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://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/modcore/html/deconworkingwithexchangewebstore.asp

    http://www.microsoft.com/china/MSDN/library/archives/library/techart/wssformsreg_v4.asp

    http://www.microsoft.com/china/MSDN/library/archives/MSDNonline/features/articles/newdevfeaturese2k.asp

                                                         by jrq

                                                        2007/02/07 雪  于石·移动


    最新回复(0)