複製鏈接
請複製以下鏈接發送給好友

DAV

鎖定
DAV,計算機科學領域術語,可以看作HTTP的擴展,也可看作一種網絡文件系統(network filesystem )。
中文名
DAV
外文名
DAV
性    質
HTTP的擴展
操作條件
鎖定、查找、移動、創建、列舉

DAV操作條件

當然,它不可能像本地文件系統一樣隨心所欲,它支持的操作還是有限的,以下三條:
1. 支持鎖定,Client可以先Lock Server上的file,然後操作;
2. 查找、定位,即DASL協議,DAV的一個子協議;
3. 拷貝、移動、創建、列舉,:不知道為什麼叫做Namespace manipulation;

DAV協議打開

用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-URL
Request.Method="PROPFIND";//有GET、POST、PROPFIND.....
if(deep==true)//設定服務器上的檢索深度
Request.Headers.Add("Depth:infinity");
else
Request.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)
{
.....
}