2012-09-13 56 views
22

一個非常典型的CRUD操作會導致一次Id被設置的對象持續存在。因此,如果我有接收對象(JSON序列化,說)的控制器上的Post方法,並返回一個HttpResponseMessage與HttpStatusCode創建和內容設置爲同一個對象與id從null更新爲整數,然後我怎麼樣使用HttpClient獲取該Id值?如何在使用WEB API時從POST中提取HttpResponseMessage的內容?

這可能很簡單,但我看到的只是System.Net.Http.StreamContent。從post方法返回一個Int更好嗎?

謝謝。

更新(以下答案):

工作示例...

namespace TryWebAPI.Models { 
    public class YouAreJoking { 
     public int? Id { get; set; } 
     public string ReallyRequiresFourPointFive { get; set; } 
    } 
} 

namespace TryWebAPI.Controllers { 
    public class RyeController : ApiController { 
     public HttpResponseMessage Post([FromBody] YouAreJoking value) { 
      //Patience simulated 
      value.Id = 42; 

      return new HttpResponseMessage(HttpStatusCode.Created) { 
       Content = new ObjectContent<YouAreJoking>(value, 
          new JsonMediaTypeFormatter(), 
          new MediaTypeWithQualityHeaderValue("application/json")) 
      }; 
     } 
    } 
} 

namespace TryWebApiClient { 
    internal class Program { 
     private static void Main(string[] args) { 
      var result = CreateHumour(); 
      Console.WriteLine(result.Id); 
      Console.ReadLine(); 
     } 

     private static YouAreJoking CreateHumour() { 
      var client = new HttpClient(); 
      var pennyDropsFinally = new YouAreJoking { ReallyRequiresFourPointFive = "yes", Id = null }; 

      YouAreJoking iGetItNow = null; 
      var result = client 
       .PostAsJsonAsync("http://localhost:1326/api/rye", pennyDropsFinally) 
       .ContinueWith(x => { 
           var response = x.Result; 
           var getResponseTask = response 
            .Content 
            .ReadAsAsync<YouAreJoking>() 
            .ContinueWith<YouAreJoking>(t => { 
             iGetItNow = t.Result; 
             return iGetItNow; 
            } 
       ); 

       Task.WaitAll(getResponseTask); 
       return x.Result; 
      }); 

      Task.WaitAll(result); 
      return iGetItNow; 
     } 
    } 
} 

似乎Node.js的啓發。

回答

48

您可以使用ReadAsAsync<T>

.NET 4(你可以做,沒有延續以及)

var resultTask = client.PostAsJsonAsync<MyObject>("http://localhost/api/service",new MyObject()).ContinueWith<HttpResponseMessage>(t => { 
    var response = t.Result; 
    var objectTask = response.Content.ReadAsAsync<MyObject>().ContinueWith<Url>(u => { 
     var myobject = u.Result; 
     //do stuff 
    }); 
}); 

.NET 4.5

var response = await client.PostAsJsonAsync<MyObject>("http://localhost/api/service", new MyObject()); 
    var myobject = await response.Content.ReadAsAsync<MyObject>(); 
+4

事實上 - 有CodePlex上的一些官樣這裏爲.NET 4.0和4.5 http://blogs.msdn.com/b/webdev/archive/2012/08/26/asp-net-web-api-and-httpclient-samples.aspx –

+0

是的。謝謝馬克。那些樣本正是我所尋找的。以某種方式錯過了他們。 – ofraski

相關問題