【问题标题】:Difference between PUT and POST using WCF REST使用 WCF REST 的 PUT 和 POST 之间的区别
【发布时间】:2012-05-21 08:40:10
【问题描述】:

我试图实现一个 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,状态码与上述相同。

谁能解释一下,在这种情况下我如何识别动词之间的差异?我无法模拟从客户端代码生成连续请求。如果这样做的行为会有所不同,有人可以帮助我修改客户端代码以连续发送连续请求吗?

【问题讨论】:

    标签: c# wcf wcf-rest


    【解决方案1】:

    当您创建新资源(在您的情况下为文件)时使用 POST 动词,重复操作会在服务器上创建多个资源。如果多次上传同名文件会在服务器上创建多个文件,则此动词会有意义。

    PUT 动词用于更新现有资源或创建具有预定义 ID 的新资源。多个操作将重新创建或更新服务器上的相同资源。如果第二次、第三次上传同名文件会覆盖之前上传的文件,这个动词就有意义了。

    【讨论】:

    • 就理论概念而言,这是正确的。但在我的情况下,即使在使用 POST 动词多次运行客户端程序之后,也没有生成上传文件的多个副本。多次运行客户端程序会导致 PUT 和 POST 动词在上述示例的上下文中的行为相同. 有人可以建议,为了复制动词之间的差异,示例中需要进行什么样的修改?
    • 为什么在使用 PUT 和 POST 时结果会有所不同?
    • 那我怎么理解,PUT 和 POST 动词的工作方式不同呢?我想使用 WCF REST 或其他一些 .NET 程序来证明这两个 REST 动词的不同行为。如果我的例子不能证明是一样的,你能给我一个实现的例子吗?
    • 我认为主要要记住的是,不同的动词所做的只是一个约定。这意味着您编写的代码可以使用任何动词做任何事情,但是如果行为与 REST 规范不同,访问它的人会感到惊讶。
    • 开发商负责。这是你如何做到的。 stackoverflow.com/questions/140104/…
    猜你喜欢
    • 2017-06-21
    • 2017-10-02
    • 2012-09-30
    • 2014-02-28
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2012-03-19
    • 2012-06-20
    相关资源
    最近更新 更多