2012-08-12 28 views
1

爲什麼.Net WebApi不會自動檢測請求contentType並執行自動綁定?爲什麼.Net WebApi不會自動檢測請求contentType並執行自動綁定?

如果我做不通知的contentType一個HTTP 500錯誤occour的請求:

No MediaTypeFormatter is available to read an object of type 'ExampleObject' from content with media type ''undefined''. 

爲什麼不嘗試檢測傳入的數據並自動綁定?

另一種情況:

這與Content-Type: application/x-www-form-urlencoded請求發送JSON

User-Agent: Fiddler 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Host: localhost:10329 
Content-Length: 42 

Request Body: 
{"Name":"qq","Email":"ww","Message":"ee"}: 

我的動作沒有檢測對象PARAM自動JSON請求數據:

public void Create(ExampleObject example) //example is null 
{ 
{ 

代替讓對象爲null,爲什麼他們不試圖解決它?

然後,對於綁定發生,我需要發送Content-Type: application/json

如果.Net WebAPI檢測到請求數據的類型並執行自動綁定,那將會最好。爲什麼不以這種方式?

+0

正在將您的內容類型指定爲表單,並且您希望asp.net覆蓋它?這對我來說似乎是一個非常糟糕的設計決定。 – 2012-08-12 20:53:26

+0

@SergRogovtsev而不是讓對象爲空爲什麼他們不試圖解決它?而當我不指定ContentType? – 2012-08-12 21:11:14

+6

因爲這會違反發件人的意圖,他*特別*設置數據格式。 – 2012-08-12 21:21:05

回答

1

application/x-www-form-urlencoded表示您將以x-www-form-urlencoded標準發送數據。以另一種標準發送數據不起作用。

+0

而不是讓對象爲空爲什麼他們不試圖解決它?而當我不指定ContentType? – 2012-08-12 21:13:33

+2

ASP.NET MVC設計背後的主要哲學之一是該框架應該堅持「互聯網標準」。因此,ASP.NET MVC基礎架構的許多方面都依賴於正確使用ContentType和HTTP動詞等元數據來正確運行。 – 2012-08-12 21:19:20

1

聽起來像你想要做的是接受來自服務器的多種格式。

http的工作方式是客戶端向服務器請求資源並告訴服務器它理解哪些內容類型。這意味着客戶端不會得到它無法解碼的響應,並且服務器知道哪些響應在客戶端上更合適。例如,如果你是一個網頁瀏覽器,最合適的內容類型是text/html,但是如果你得到了XML,你也可以用它來做一些事情。所以,你會做有以下要求:

accept: text/html, application/xml 

此說你喜歡HTML,但也明白XML

在您的例子,如果你的客戶想要的應用程序/ X WWW的形式,進行了urlencoded,但也可以處理使用JSON,那麼你應該做的請求

accept: application/x-www-form-urlencoded, application/json 

時有關詳細信息請執行下列操作請參見HTTP規範上接受報頭,這裏http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

您可能還需要創建一個新的媒體類型格式化程序,以便您的服務器知道如何爲客戶機應用程序提供/ x-www-form-urlencoded,請參閱此博客文章以瞭解有關如何執行此操作的更多信息http://www.strathweb.com/2012/04/rss-atom-mediatypeformatter-for-asp-net-webapi/

+0

看到問題。我沒有檢索數據,我發佈數據。 webapi中的 – 2012-08-12 22:42:33

+0

同樣的規則適用於帖子。唯一的區別是,不是設置一組接受標題,而是指定一個單獨的內容類型標題,它告訴服務器發佈數據的類型。如果服務器不知道如何解碼數據(也就是說它有內容類型的媒體類型格式化程序),http說它應該拋出一個400(壞請求)。 – 2012-08-13 00:01:25