操作條件
當然,它不可能像本地檔案系統一樣
隨心所欲,它支持的操作還是有限的,以下三條:
1. 支持
鎖定,Client可以先Lock Server上的file,然後操作;
2. 查找、定位,即DASL協定,DAV的一個子協定;
3. 拷貝、移動、創建、列舉,:不知道為什麼叫做Namespace manipulation;
協定打開
用FrontPage、Excess等打開、編輯遠程網站用的就是這個協定,它使得FrontPage可以編輯、覆蓋、刪除Server上的檔案。
首先看看DASL協定是如何查找Server端的檔案系統:
總原則:使用Request傳送XML格式的查詢字元串(Request-URI),得到Response,包含查詢結果(也是XML格式);
Request-URL語法的一般形式:
<d:searchrequestxmlns:d="DAV:"><d:basicsearch><d:select><d:prop><d:getcontentlength/></d:prop></d:select><d:from><d:scope><d:href>/container1/</d:href><d:depth>infinity</d:depth></d:scope></d:from><d:where><d:gt><d:prop><d:getcontentlength/></d:prop><d:literal>10000</d:literal></d:gt></d:where><d:orderby><d:order><d:prop><d:getcontentlength/></d:prop><d:ascending/></d:order></d:orderby></d:basicsearch></d:searchrequest>
下面是獲取url下所有目錄、檔案信息的C#代碼,目的就是組合一個 HTTP頭+Request-URL:
//url指定Server端的檢索目錄,我認為也可以通過Request-URL的DAV:where部分來定:HttpWebRequestRequest=(HttpWebRequest)HttpWebRequest.Create(url);Request.Headers.Add("Translate:f");Request.Credentials=CredentialCache.DefaultCredentials;stringrequestString="<?xmlversion=\"1.0\"encoding=\"utf-8\"?>"+"<a:propfindxmlns:a=\"DAV:\">"+"<a:prop>"+"<a:displayname/>"+"<a:iscollection/>"+"<a:getlastmodified/>"+"</a:prop>"+"</a:propfind>";MessageBox.Show(requestString.ToString());//只是顯示一下Request-URLRequest.Method="PROPFIND";//有GET、POST、PROPFIND.....if(deep==true)//設定伺服器上的檢索深度Request.Headers.Add("Depth:infinity");elseRequest.Headers.Add("Depth:1");Request.ContentLength=requestString.Length;Request.ContentType="text/xml";StreamrequestStream=Request.GetRequestStream();requestStream.Write(Encoding.ASCII.GetBytes(requestString),0,Encoding.ASCII.GetBytes(requestString).Length);requestStream.Close();HttpWebResponseResponse;StreamReaderrespStream;try{Response=(HttpWebResponse)Request.GetResponse();respStream=newStreamReader(Response.GetResponseStream());}catch(WebExceptione){.....}