Web Storage System + WebDAV

标题: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 雪  于石·移动

posted @ 2007-02-08 01:00  程序员的那些  阅读(308)  评论(0编辑  收藏  举报