【发布时间】:2012-06-07 14:41:27
【问题描述】:
我一直在使用 MVC4 测试版,目前正在努力升级到最近发布的 RC 版本。
模型绑定的复杂请求类型似乎发生了变化,但我无法弄清楚我做错了什么/做错了什么。
例如,假设我有以下 API 控制器:
public class HomeApiController : ApiController
{
public TestModel Get()
{
return new TestModel
{
Id = int.MaxValue,
Description = "TestDescription",
Time = DateTime.Now
};
}
}
这会产生预期的结果:
<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>
现在说我只是更改签名,接受请求类型,如下所示:
public TestModel Get(TestRequestModel request)
{
...
public class TestRequestModel
{
public int? SomeParameter { get; set; }
}
我现在收到以下错误:
<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>
我查看了HttpContentExtensions 中引发此异常的源代码,但它看起来像是检查内容标题(我应该有),如果没有,它会尝试从MediaTypeFormatter 集合中为特定类型(它不能)获取格式化程序,然后抛出。
还有其他人经历过这种情况吗?我缺少一些全球注册?
【问题讨论】:
-
fiddler中的HTTP请求是什么?具体来说,
Content-Type标头值是什么? -
我可以手动传递
application/json的Content-Type,有趣的是,这让我克服了那个错误(我只在接受标头中传递了application/json)。但现在复杂类型以 null 的形式出现,这似乎有一些共同的潜在问题。 -
那么
accept是什么?Accept: application/json不起作用??尝试在参数上使用[FromBody]。
标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api model-binding