Разница между PUT и POST с использованием WCF REST

Я попытался реализовать REST WCF, чтобы изучить разницу между глаголом 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». Код состояния одинаков в случае существования или отсутствия файла в месте загрузки.

Я изменил глагол REST на PUT, и код состояния такой же, как указано выше.

Может ли кто-нибудь объяснить, как я могу определить различия между глаголами в этом контексте? Я не смог смоделировать генерацию непрерывного запроса из клиентского кода. Если при этом поведение будет отличаться, может ли кто-нибудь помочь мне изменить клиентский код в ordrr для отправки непрерывного запроса в строке?


person techmad    schedule 13.05.2012    source источник


Ответы (1)


Глагол POST используется, когда вы создаете новый ресурс (файл в вашем случае), и повторные операции создадут несколько ресурсов на сервере. Этот глагол имеет смысл, если загрузка файла с одним и тем же именем несколько раз создает несколько файлов на сервере.

Глагол PUT используется, когда вы обновляете существующий ресурс или создаете новый ресурс с предопределенным идентификатором. Несколько операций будут воссоздавать или обновлять один и тот же ресурс на сервере. Этот глагол имеет смысл, если загрузка файла с тем же именем во второй, третий... раз перезапишет ранее загруженный файл.

person Dmitry S.    schedule 13.05.2012
comment
Это верно, поскольку речь идет о теоретической концепции. Но в моем случае не было создано ни одной копии загруженного файла, даже после многократного запуска клиентской программы с использованием глагола POST. Многократный запуск клиентской программы приводит к одинаковому поведению для глаголов PUT и POST в контексте приведенного выше примера. .Может ли кто-нибудь подсказать, какая модификация требуется в примере, чтобы воспроизвести разницу между глаголами? - person techmad; 13.05.2012
comment
Почему вы ожидаете разницу в результатах при использовании PUT и POST? - person Dmitry S.; 13.05.2012
comment
Тогда как я могу понять, что глаголы PUT и POST работают по-разному? Я хочу доказать различное поведение этих двух глаголов REST, используя WCF REST или какую-либо другую программу .NET. Если мой пример не может доказать то же самое, не могли бы вы предоставить мне реализованный пример? - person techmad; 14.05.2012
comment
Я думаю, главное помнить, что то, что делают разные глаголы, — это просто условность. Это означает, что код, который вы пишете, может делать все, что захочет, с любым глаголом, но люди, обращающиеся к нему, будут удивлены, если поведение будет отличаться от спецификации REST. - person Robert Elm; 14.05.2012
comment
Как заявил Родимиус, глаголы POST и PUT не будут вести себя по-разному. Существуют соглашения о ресурсах, которые я упомянул в своем ответе, и они должны применяться через код. Вам нужно установить правильные коды ответов для сценариев из вашего кода. - person Dmitry S.; 14.05.2012
comment
Ну, в моем случае, поскольку есть служба WCF REST, обрабатывающая PUT или POST, кто возьмет на себя ответственность за отправку соответствующего кода состояния и желаемого поведения? 1) веб-сервер IIS, где был размещен? 2) Фреймворк WCF REST? 3) Ручная реализация кода в сервисном методе? - person techmad; 14.05.2012
comment
Разработчик несет ответственность. Вот как вы можете это сделать. stackoverflow.com/questions/140104/ - person Dmitry S.; 14.05.2012