2012-05-13 3 views
4

PUT과 POST 동사 간의 차이를 알아보기 위해 REST WCF를 구현하려고했습니다. 서비스를 사용하여 특정 위치에 파일을 올렸습니다.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(); 

}

클라이언트 코드는 다음과 같습니다 :

서비스 구현은 folowing 같다

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". 업로드 위치에 파일이 존재하거나 존재하지 않는 경우에도 상태 코드는 동일합니다.

REST 동사를 PUT으로 변경했으며 상태 코드는 위와 같습니다.

아무도 설명 할 수 없지만이 컨텍스트에서 동사 간의 차이점을 어떻게 확인할 수 있습니까? 나는 지속적인 요청 fron 클라이언트 코드를 생성하는 것을 시뮬레이션 할 수 없었다. 그렇게하면 동작이 달라지면 아무도 ordrr의 클라이언트 코드를 수정하여 연속적인 요청을 보내도록 도울 수 있습니까?

답변

2

POST 동사는 새 리소스 (귀하의 경우 파일)를 만들고 반복 된 작업으로 서버에 여러 리소스가 생성 될 때 사용됩니다. 같은 이름의 파일을 여러 번 업로드하면 여러 파일이 서버에 작성되는 경우이 동사가 유용합니다.

PUT 동사는 기존 리소스를 업데이트하거나 미리 정의 된 ID로 새 리소스를 만들 때 사용됩니다. 여러 작업을 통해 서버의 동일한 리소스를 다시 만들거나 업데이트 할 수 있습니다. 이 동사는 두 번째, 세 번째 ... 시간에 동일한 이름의 파일을 업로드하면 이전에 업로드 된 파일을 덮어 쓰게됩니다.

+0

이론적 개념에 관한 한 사실입니다. 하지만 내 경우에는 POST 동사를 사용하여 클라이언트 프로그램을 여러 번 실행 한 후에도 업로드 된 파일의 사본이 여러 번 생성되지 않았습니다. 클라이언트 프로그램을 여러 번 실행하면 위의 예의 컨텍스트에서 PUT 및 POST 동사에 대해 동일한 동작이 발생합니다 어떤 사람이 제안 했는가?이 예에서 어떤 종류의 수정이 필요한가? 동사 간의 차이를 재현하려면? – techmad

+0

PUT 대 POST를 사용할 때 결과에 ​​차이가 나는 이유는 무엇입니까? –

+0

그러면 어떻게 이해할 수 있습니까? PUT 및 POST 동사가 다른 방식으로 작동합니까? WCF REST 또는 다른 .NET 프로그램을 사용하여이 두 가지 REST 동사의 다른 동작을 증명하고 싶습니다. 예제가 동일하지 않다면 구현 된 예제를 제공해 주시겠습니까? – techmad