Utilizzo la MVC4 beta e sto attualmente lavorando per l'aggiornamento alla RC rilasciata di recente versione.Aggiornamento a MVC4 RC: No MediaTypeFormatter è disponibile per leggere un oggetto di tipo 'TestRequestModel' dal contenuto con tipo di supporto '' indefinito ''
Sembra che i tipi di richieste complesse modello vincolante è cambiato, ma io non riesco a capire come/cosa sto facendo male.
Per esempio, dire che ho il seguente controller API:
public class HomeApiController : ApiController
{
public TestModel Get()
{
return new TestModel
{
Id = int.MaxValue,
Description = "TestDescription",
Time = DateTime.Now
};
}
}
Questo produce il risultato previsto:
<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/xxxx">
<Description>TestDescription</Description>
<Id>2147483647</Id>
<Time>2012-06-07T10:30:01.459147-04:00</Time>
</TestModel>
Ora dicono mi limito a cambiare la firma, prendendo in un tipo di richiesta, come questo:
public TestModel Get(TestRequestModel request)
{
...
public class TestRequestModel
{
public int? SomeParameter { get; set; }
}
ora ottengo il seguente errore:
0.123.516,41 mila<Exception xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Web.Http.Dispatcher">
<ExceptionType>System.InvalidOperationException</ExceptionType>
<Message>
No MediaTypeFormatter is available to read an object of type 'TestRequestModel' from content with media type ''undefined''.
</Message>
<StackTrace>
at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger) at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger) at System.Web.Http.ModelBinding.FormatterParameterBinding.ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) at System.Web.Http.Controllers.HttpActionBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(HttpParameterBinding parameterBinder) at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() at System.Threading.Tasks.TaskHelpers.IterateImpl(IEnumerator`1 enumerator, CancellationToken cancellationToken)
</StackTrace>
</Exception>
Ho guardato il codice sorgente di dove questo viene generata un'eccezione nel HttpContentExtensions
, ma sembra che verifica la presenza di intestazioni di contenuto (che dovrei avere), e se non ha che cerca per ottenere un formattatore dalla raccolta MediaTypeFormatter
che ha per il tipo specifico (che non può) e quindi genera.
Chiunque altro ha provato questo? Qualche registrazione globale mi manca?
Qual è la richiesta HTTP nel violinista?In particolare qual è il valore dell'intestazione 'Content-Type'? – Aliostad
Posso passare manualmente un 'Content-Type' di' application/json', che, curiosamente, mi supera l'errore (avevo passato 'application/json' solo nell'intestazione accept). Ma ora i tipi complessi arrivano come nulli, il che sembra condividere alcuni problemi di fondo comuni. –
Allora, che cosa c'è in te? Accetto? 'Accettare: application/json' non funziona ?? Prova a usare '[FromBody]' sul parametro. – Aliostad