2012-04-02 5 views
15

. Bir şeyleri bir yere dağıtabilirdim ama ne olduğunu bilmiyorum.ASP.NET Web API - Hayır 'MediaTypeFormatter' türünde bir nesne okunabilir duruma 'Int32' Burada ne olduğu hakkında tamamen emin değilim

Benim API kontrolör yöntemi şöyle görünür:

public HttpResponseMessage<string> Put(int id) 

Ben bir dize ile de aynı hatayı denedim.

Herhangi bir fikrin var mı?

Teşekkürler.

Düzenleme: Açık olmak gerekirse - id rota parametredir. İsteğin gövdesi JSON. Rota parametresini kaldırırsam, yöntem normal çalışır.

+0

Ham istek gönderebilir misiniz (Fiddler veya FireBug)? – tpeczek

+1

Varsayılan biçimlendiricileri kaldırdınız mı? Yapılandırma kodunu da gönderir misiniz? – tugberk

+0

Hangi yapılandırma bölümlerini istiyorsunuz? –

cevap

6

blog post aşağıdaki okuyunuz:

Bu basit parametreler kullanılarak ile en tipik sorunları tanımlar.İsteğinizin nasıl göründüğüne dair daha fazla ayrıntı bilmeden, hangisini vurduğunuzu belirlemek mümkün değildir.

GÜNCELLEME

rota değerleri dikkate alınarak bir daha bilinen bir hata var. POST/PUT/PATCH isteği için yerleşik formatlardan biri kullanılmadığında, rota değerleri parametreleri bağlanmaz. aşağıda açıklandığı gibi bu en iyi çözüm geçici olarak çözmek için ActionFilterAttribute yazmaktır:

+0

Sorunum, özellikle yol parametresinin kendisidir. Yukarıdaki yöntem tanımında Int id. –

+0

@RobertoBonini Rota Değerleri için bilinen bir daha bilinen bir hatanın cevabını güncelledim. – tpeczek

+0

Bunun bir hata olduğunu bilmiyorduk - teşekkürler. –

13

Şaşırtıcı int ve dize varsayılan bir MediaTypeFormatter yok, bu yüzden bu tür kiri nasıl bilmiyor.

o kutunun dışında ele bilir sadece tipleri JSON, XML ve form url kodlanmış verileri bulunmaktadır. Bu alıntı Web API serializes ve HTTP ileti gövdesini deserializes nasıl Web API olarak http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

, medya türü belirler, resmi asp.net web sitesinden olduğunu. XML, JSON ve form-urlencoded veri için yerleşik destek vardır ve bir ortam biçimlendirici yazarak ek ortam türlerini destekleyebilirsiniz.

Şimdi kendi MediaTypeFormatter (nasıl sağlanan bağlantı göstereceğim) yazma 'olabilir' ama asp.net web API hala beta beri özel biçemleyicileri kullanarak onunla çok problem oldu dizgiler gibi basit tipler için. Sadece xml/json'da PUT yapmak istediğiniz herhangi bir değeri sarmak ve otomatik olarak seri hale getirilmeyi çok daha kolay buldum. , Bu konuda daha fazla bilgi için buraya spesifik bir örnek sizin PUT vücut gibi görünecektir için When HTTP-POST has body, url parameter is null

, benim yazı Bkz

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

Ardından metne sizin http isteği/xml content-type ayarlamayı unutmayın (veya kullanmayı tercih ederseniz uygulama/json). Ve değişkenin içine iyi serileştirilmelidir.

+0

Bu, vücutta geçiriliyorsa geçerli olur. Sorunum, rota parametresinin kendisi ile ilgilidir - bu durumda, id. –

+0

Evet, bu asp.net web api beta'da bir hata gibi görünüyor. Bir PUT veya POST'ta bir bedeniniz olduğunda, url parametresi boş olacaktır. Şu an için sunabileceğim tek alternatif, vücuttaki her şeyi geçmektir, ancak bunun, önemli olan RESTful url yapınızı tehlikeye atabileceğini biliyorum. – Despertar

+0

Bence bu kabul edilen cevap olmalı. Mevcut kabul edilen cevap sorunu ele alıyor, ancak çözümü yok. Bu cevabı çözüm var. –

5

Int değerini istek mesajının gövdesine mi yerleştiriyorsunuz? Eğer öyleyse, formatı nedir? İçerik türü metin ise

, Web API Web API metin için bir medya biçimlendirici sağlamaz, çünkü onunla ne yapacağını bilemezsiniz. Despertar'ın belirttiği gibi özel bir biçimlendirici yazabilirsiniz.

Ayrıca böyle bir şey yapabilirsiniz:

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

Gövde JSON. Sadece bir rota parametresiyle çalışmak için ihtiyacım var. Rota parametresini yöntem tanımından kaldırırsam çalışır. –

0

Ben bir json gövdesiyle SİL yayınlanan ve bu aldı. Parametrelerle gönderme sorunu çözdü.

İlgili konular