ASP.NET WebAPI RC 竟然不支援最常用的json傳參

來源:互聯網
上載者:User

標籤:

壯士斷腕(WCF Web API),為的是 ASP.NET Web API 的橫空出世,再加上它的開放(開源),於是對之產生了一點點癡情,並寫下了HttpClient + ASP.NET Web API, WCF之外的另一個選擇。那時,ASP.NET Web API 還處於 beta 階段,俗話說女大十八變,自然對 ASP.NET Web API RC 產生了憧憬。。。

ASP.NET Web API RC 閃亮登場之後,還未一睹廬山真面目,就有人陸陸續續反饋之前博文中的範例程式碼在 ASP.NET Web API RC 版中無法正常運行。其間,我們有一個使用了 ASP.NET Web API 的項目升級至 ASP.NET Web API RC 之後也遇到了同樣的問題,通過 HttpClien 將 json 格式的資料 post 給伺服器之後,服務端控制器中對應的 Action 卻收不到資料,錯誤資訊為:"The parameters dictionary contains a null entry for parameter ‘startId‘ of non-nullable type ‘System.Int32‘ for method..."。

開始以為是 HttpClient 的問題,之前的代碼是通過 Json.NET 將需要傳遞的資料序列化為 json 字串的,代碼如下:

var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });HttpContent httpContent = new StringContent(requestJson);httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");var httpClient = new HttpClient();var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)    .Result.Content.ReadAsStringAsync().Result;

而 ASP.NET Web API RC 的改進之一是內建對 Json.NET 的支援,所以 post json 格式的資料更簡單了,上面的代碼可以改為:

var responseJson = new HttpClient().PostAsJsonAsync("http://test.cnblogs.cc/api/demo/sitelist",new { startId = 1, itemcount = 3 }).Result.Content.ReadAsStringAsync().Result;

但是 HttpClient 的代碼更改之後,問題依然存在,用 Fiddler 查看了一下 post 過去的資料,原汁原味正宗的 json 資料,看來問題出在伺服器端。

這時,有人反饋通過 jQuery 的 $.ajax 提交 json 資料,服務端也收不到。不用想了,問題肯定出在服務端。看看樣本程式的服務端代碼:

public class DemoController : ApiController{    public IList<Site> SiteList(int startId, int itemcount)    {        ...        return result;    }}

問題應該出在 RC 版本中,ASP.NET Web API 將接收到的 post 資料傳統給 Action 的處理方式發生了改變。首先可以肯定的是,ASP.NET Web API RC 不可能不支援 json 參數。難道要為此定義一個類(比如這裡叫SiteListQuery),將目前的參數都作為類的屬性,代碼如下:

public class DemoController : ApiController{    public IList<Site> SiteList(SiteListQuery query)    {        ...        return result;    }}public class SiteListQuery{    public int startId { get; set; }    public int itemcount { get; set; }}

如果真是這樣,就需要定義很多這樣的參數類,而且即使只有一個參數,也要定義一個類。如果真是這樣,我寧願不用 ASP.NET Web API。

當時想到這裡,就沒有進一步去實驗,心想既然不支援常用的 json 傳參方式,那就暫時不用 ASP.NET Web API RC,等正式版出來再看。

今天一位同事證實了的確需要定義一個專門的參數類,才能支援 json 傳參。

當同事告訴我之後,那種愛恨交加的不是滋味的感覺就迸發出來了。怎麼能這樣設計,即使這樣設計有它的道理,也不能放棄對通常使用方式的相容啊。良好的相容性是微軟的發家之本,怎麼在這裡就被無視呢?查看 ASP.NET Web API 的原始碼,這部分也沒有完整的測試代碼。ASP.NET 也許是微軟的無心插柳,但現在柳成萌了,何不借勢發展為森林呢?捨不得丟下案頭,怎能開創未來?將  ASP.NET Web Stack 開源,究竟是因為它無關緊要,還是因為真正想通過社區的力量讓它發展得更好?在這樣的關鍵時期,微軟是在拿自己的劣勢追趕別人的優勢,還是在拿自己的優勢超越別人?

癡情的不是 ASP.NET Web API,而是用更優雅的技術更好的解決實際問題;

意外的不是這個有點糟糕的設計,而且沒有真正從開發人員的角度去考慮。

(註:一氣呵成,一吐為快,也是一種寫部落格的方式,寫的不妥之處望見諒)

ASP.NET WebAPI RC 竟然不支援最常用的json傳參

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.