8

私は 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コレクションからフォーマッタを取得しようとします。特定のタイプ(それはできません)を持ってからスローします。

他の誰かがこれを経験しましたか?いくつかのグローバル登録がありませんか?

4

2 に答える 2

13

元の質問に回答したようですが、もう1つの質問に回答するために、RCではモデルバインディングが多少変更されています。

http://weblogs.thinktecture.com/cweyer/2012/06/aspnet-web-api-changes-from-beta-to-rc.html

このリンクには、それに関するいくつかの詳細があります。しかし、あなたに影響を与えているように見える変更を要約すると、モデルバインディングは、リクエストの本文またはURIのいずれかからその値を取得します。これは以前のリリースにも当てはまりますが、リリース候補を使用すると、MVC4はデフォルトで、本体で複合型を検索し、URIで値型を検索します。

したがって、「SomeParameter」キーを含むリクエストを含む本文を送信すると、バインドされていることがわかります。または、宣言を次のように変更すると、URLにバインドできます。

 public TestModel Get(int? someParameter)
 {

 }

ありがたいことに、チームはこれに関する潜在的な問題を予測し、この動作をオーバーライドするために使用できる属性を残しました。

 public TestModel Get([FromUri]TestRequestModel request)
 {

 }

ここで重要なの[FromUri]は、モデルバインダーにURIで値を探すように指示することです。[FromBody]リクエストの本文に値型を入れたい場合もあります。

于 2012-06-08T12:16:20.397 に答える
2

私たちは同じことを見ていました。私たちの場合、問題はgetメソッドに渡される複雑なオブジェクトでした。そのメソッドのパラメーターに[FromUri]属性を追加する必要がありました。

http://forums.asp.net/t/1809925.aspx/1?GET+requests+with+complex+object+as+input+parameter

public class SearchController : ApiController
{
    // added [FromUri] in beta to RC transition otherwise media type formatter error
    public IQueryable<SearchResultEventModel> Get( [FromUri]SearchSpecModel search )
    {
        // ...
    }
}
于 2012-06-07T20:18:40.113 に答える