C# 使用WCF REST的PUT和POST之间的差异

C# 使用WCF REST的PUT和POST之间的差异,c#,wcf,wcf-rest,C#,Wcf,Wcf Rest,为了探索PUT和POST-verb之间的区别,我尝试实现REST-WCF。我已使用该服务在某个位置上传了一个文件 服务实现如下所示: [OperationContract] [WebInvoke(UriTemplate = "/UploadFile", Method = "POST")] void UploadFile(Stream fileContents); public void UploadFile(Stream fileContents) { byte[] buffer = new

为了探索PUT和POST-verb之间的区别,我尝试实现REST-WCF。我已使用该服务在某个位置上传了一个文件

服务实现如下所示:

[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中的客户端代码以连续发送请求吗?

在创建新资源(您的案例中的文件)时使用POST动词,重复操作会在服务器上创建多个资源。如果多次上载具有相同名称的文件会在服务器上创建多个文件,则此动词有意义


更新现有资源或创建具有预定义id的新资源时使用PUT谓词。多个操作将在服务器上重新创建或更新同一资源。如果上载第二个、第三个文件的名称相同,则此动词有意义。。。时间会覆盖之前上传的文件。

就理论概念而言,这是正确的。但在我的情况下,即使在使用POST谓词多次运行客户端程序后,也没有生成上载文件的多个副本。在上述示例中,多次运行客户端程序导致PUT和POST谓词的行为相同。是否有人建议,示例中需要进行何种修改,为了复制动词之间的差异?为什么在使用PUT和POST时,您希望结果有所不同?那么我如何理解,PUT和POST动词以不同的方式工作?我想用WCF REST或其他一些.NET程序来证明这两个REST动词的不同行为。如果我的例子不能证明相同,你能给我一个实现的例子吗?我想主要要记住的是不同的动词所做的只是一个约定。这意味着您编写的代码可以用任何动词做它想做的任何事情,但是如果行为与REST规范不同,访问它的人会感到惊讶。开发人员对此负责。这是你可以做到的。