簡體   English   中英

ASP.NET Web API - 沒有“MediaTypeFormatter”可用於讀取“Int32”類型的對象

[英]ASP.NET Web API - No 'MediaTypeFormatter' is available to read an object of type 'Int32'

我不完全確定這里發生了什么。 我可能在某處弄亂了,但我不知道是什么。

我的API控制器方法如下所示:

public HttpResponseMessage<string> Put(int id)

我也試過一個字符串也有同樣的錯誤。

有任何想法嗎?

謝謝。

編輯:要清楚 - id是路由參數。 請求的主體是JSON。 如果我刪除route參數,該方法將正常運行。

令人驚訝的是,int和string默認沒有MediaTypeFormatter,因此它不知道如何處理這些類型。

它知道如何處理開箱即用的唯一類型是JSON,XML和表單url編碼數據。 該引用來自官方asp.net網站, http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

在Web API中,媒體類型確定Web API如何序列化和反序列化HTTP消息體。 內置對XML,JSON和表單urlencoded數據的支持,您可以通過編寫媒體格式化程序來支持其他媒體類型。

現在你可以'編寫自己的MediaTypeFormatter(我提供的鏈接會告訴你如何),但是由於asp.net web api仍然處於測試階段,因此使用自定義格式化程序來處理類似字符串的簡單類型時遇到了很多麻煩。 我發現在xml / json中包裝你想要PUT的任何值都要容易得多,它會自動反序列化。 有關詳細信息,請參閱我的帖子, 當HTTP-POST有body時,url參數為null

對於您的具體示例,您的PUT主體看起來像,

<message>
   <id>6</id>
</message>

然后一定要將http請求的內容類型設置為text / xml(如果選擇使用,則設置為application / json)。 它應該很好地序列化到變量中。

您是否將int值放在請求消息的正文中? 如果是這樣,格式是什么?

如果內容類型是文本,則Web API將不知道如何處理它,因為Web API不提供文本的媒體格式化程序。 Despertar指出,您可以編寫自定義格式化程序。

你也可以這樣做:

public void Put()
{
    var s = Request.Content.ReadAsStringAsync().Result;
}

請閱讀以下博文:

這描述了使用簡單參數的大多數典型問題。 如果不了解有關您的請求的詳細信息,則無法確定您遇到的請求。

UPDATE

還有一個已知的錯誤考慮了路由值。 如果沒有一個內置格式化程序用於POST / PUT / PATCH請求,則路由值參數不會被綁定。 要解決此問題,最好的解決方案是編寫ActionFilterAttribute,如下所述:

我發布了一個帶有json體的DELETE並收到了這個。 使用參數發布解決了問題。

在旁注...我已經看到它在服務開始需要'HTTPS'時拋出此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM