2012-05-13 28 views
4

我試圖實現REST WCF,以便探究PUT和POST動詞之間的區別。我已經使用該服務在一個位置上升了一個文件。使用WCF REST的PUT和POST之間的區別

服務實現是因爲如下因素:

[OperationContract] 
[WebInvoke(UriTemplate = "/UploadFile", Method = "POST")] 
void UploadFile(Stream fileContents); 

public void UploadFile(Stream fileContents) 
{ 
byte[] buffer = new byte[32768]; 
MemoryStream ms = new MemoryStream(); 
int bytesRead, totalBytesRead = 0; 
do 
{ 
     bytesRead = fileContents.Read(buffer, 0, buffer.Length); 
     totalBytesRead += bytesRead; 

     ms.Write(buffer, 0, bytesRead); 
    } while (bytesRead > 0); 

    using (FileStream fs = File.OpenWrite(@"C:\temp\test.txt")) 
    { 
     ms.WriteTo(fs); 
    } 

    ms.Close(); 

}

客戶端代碼如下:

HttpWebRequest request =  (HttpWebRequest)HttpWebRequest.Create("http://localhost:1922 /EMPRESTService.svc/UploadFile"); 
     request.Method = "POST"; 
     request.ContentType = "text/plain"; 

     byte[] fileToSend = File.ReadAllBytes(@"C:\TEMP\log.txt"); // txtFileName contains the name of the file to upload. 
     request.ContentLength = fileToSend.Length; 

     using (Stream requestStream = request.GetRequestStream()) 
     { 
      // Send the file as body request. 
      requestStream.Write(fileToSend, 0, fileToSend.Length); 
      //requestStream.Close(); 
     } 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      Console.WriteLine("HTTP/{0} {1} {2}", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription); 
     Console.ReadLine(); 

該文件被上傳和響應狀態代碼被返回「200 OK」。 satus代碼在上傳位置存在或不存在文件的情況下是相同的。

我已將REST動詞更改爲PUT,狀態碼與上面相同。

有人可以解釋一下,我怎麼能夠在這種情況下找出動詞之間的區別?我無法模擬生成連續的客戶端代碼請求。如果這樣做的行爲會有所不同,任何人都可以幫助我修改ordrr中的客戶端代碼以連續發送連續的請求嗎?

回答

2

當您創建新資源(您的案例中的文件)和重複的操作會在服務器上創建多個資源時,會使用POST謂詞。如果多次上傳具有相同名稱的文件在服務器上創建多個文件,則此謂詞很有意義。

當您更新現有資源或使用預定義ID創建新資源時,會使用PUT謂詞。多個操作會重新創建或更新服務器上的相同資源。如果第二個,第三個...時間上傳一個具有相同名稱的文件會覆蓋先前上傳的文件,則此謂詞是有意義的。

+0

就理論概念而言,這是真的。但在我的情況下,即使在使用POST動詞多次運行客戶端程序之後,也沒有生成多個上傳文件的副本。運行客戶端程序多次,導致PUT和POST動詞在上述示例的上下文中具有相同的行爲。有人可能會提出,在這個例子中,爲了重現動詞之間的區別,需要進行什麼樣的修改? – techmad

+0

爲什麼在使用PUT vs POST時預期結果會有所不同? –

+0

那麼我怎麼理解,PUT和POST動詞以不同的方式工作?我想用WCF REST或其他一些.NET程序來證明這兩個REST動詞的不同行爲。如果我的例子不能證明是一樣的,請給我一個實現的例子嗎? – techmad

相關問題