2014-03-19 65 views
0

目前我們有一個通用的MVC方法GET的距離的ASP.NET Web API數據了HTTPClient GetAsync後對象

public static T Get<T>(string apiURI, object p) 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri(Config.API_BaseSite); 

      HttpResponseMessage response = client.GetAsync(apiURI).Result; 


      // Check that response was successful or throw exception 
      if (response.IsSuccessStatusCode == false) 
      { 
       string responseBody = response.Content.ReadAsStringAsync().Result; 
       throw new HttpException((int)response.StatusCode, responseBody); 
      } 

      T res = response.Content.ReadAsAsync<T>().Result; 
      return (T)res; 
     } 
    } 

我們的問題是: - 顯然,我們不能派「P」,你會與一個職位,

client.PostAsync(apiURI, new StringContent(p.ToString(), Encoding.UTF8, "application/json") 

但我們怎麼去發送這個對象/ JSON與一個get。 我們已經看到將它作爲URL的一部分發送,但是,還有其他選擇嗎?

+0

在ASP.Net運行時主機下使用.Result會引起你一個痛苦的世界。 –

+0

@達勒爾米勒請你詳細說明。有什麼問題使用這個? – Simon

+1

ASP.Net運行時的Syncronization上下文只支持一次運行的單個線程,這就是爲什麼你可以訪問像HttpContext這樣的靜態。但是,當你這樣做的時候。結果會阻塞正在執行的線程。如果async方法中的任何代碼嘗試訪問HttpContext,則會導致死鎖。引用ASP.NET團隊的開發人員Brad Wilson「在ASP.NET管道中使用.Result或.Wait(或任何相關的)會導致死鎖,我保證。」 –

回答

1

GET發送帶有查詢字符串(url結尾)的值,關於「但是我們怎麼去發送這個對象/帶有get的JSON,我們已經看到它是作爲URL的一部分發送的,但是,有沒有其他選擇?「。

替代方案是POSTPUT

PUT最適合在用戶創建密鑰/網址時使用。你可以看看cnn.com這樣的例子 - 這裏的URL只是文章標題的簡短版本。您想要在該URL上放置一個頁面。

例子: http://newday.blogs.cnn.com/2014/03/19/five-things-to-know-for-your-new-day-wednesday-march-19-2014/?hpt=hp_t2

具有的URL「五事方知換您的全新天週三日至19-2014」,這是從文章標題中產生「五件事知道你的新日 - 週三,2014年3月19日」

在一般情況下,應遵循以下原則:

使用GET,當你想從服務器獲取數據。想想搜索引擎。您可以在查詢字符串中看到您的搜索查詢。您也可以預訂標記。它根本不會改變服務器上的任何東西。

使用POST當你想創建一個資源。

使用PUT當你想創建資源,但它也覆蓋它們。如果您將對象放置兩次,則服務器狀態只會更改一次。相反的是POST

使用真正DELETE當你想刪除的東西

無論是POST也不PUT使用的查詢字符串。 GET確實

+1

POST和PUT都可以使用查詢字符串以及正文。 –