本文將概述在WebAPI方式下將如何將參數綁定到一個action方法包括參數是如何被讀取一系列規則決定特定環境采用的那種綁定方式文章最後將給出一些實際的例子
Parameter binding說到底是接到一個Http請求將其轉換成NET類型使得action方法的簽名更易於理解
請求消息(request message)包括了請求的所有信息如帶查詢字符串的請求地址(URL)內容主體(content body)及頭部信息(header)在沒有采用parameter binding
的情況下每個action方法將需要接收request message並手動從中提取出參數如下所示
public object MyAction(HttpRequestMessage request){ // make explicit calls to get parameters from the request object int id = intParse(requestRequestUriParseQueryString()Get(id)); // need error logic! Customer c = requestContentReadAsAsync()Result; // should be async! // Now use id and customer}
很顯然這樣的方式丑陋易出錯代碼重復而且難以單元測試我們希望action的簽名類似以下的形式
public object MyAction(int id Customer c) { }
那麼WebAPI是如何將request message轉換成像id和customer這樣的參數的呢?
Model Binding vs Formatters
參數綁定有兩種技術Model Binding和Formatters實際上WebAPI使用model binding讀取查詢字符串(query string)內容進行參數綁定使用Formatters讀取主體內容
(body content)進行參數的綁定
Using Model Binding:
ModelBinding和MVC中的此概念是一致的更多內容見Here通常有一個ValuePeoviders提供數據片斷如查詢字符串參數model binder將這些片斷組合成一個對象
Using Formatters
Formatters(如MediaTypeFormatter類所示)實際上是包含額外元數據的序列化程序WebAPI從HttpConfiguration中獲取一個formatters的列表然後通過request信息
中的contenttype來判斷采用具體合適的formatterWebAPI有不少默認的formatters默認的JSON formatter是JSONNET還有Xml formatter和采用JQuery語法的
FormUrl formatter
其中Formatters的核心方法是MediaTypeFormatterReadFromStreamAsync如下所示
public virtual Task
From:http://tw.wingwit.com/Article/program/net/201311/12750.html