0

Web API のコンテンツ ネゴシエーションとカスタム フォーマッタを調べて、一般的なカスタム フォーマッタを使用しようとしています。RazorEngine を使用して、Web API コントローラーからの応答メッセージとして返されるかみそりビューを解析しています。

これが私のフォーマッタ構成です

        GlobalConfiguration.Configuration.Formatters.Insert(0, new RazorViewFormatter<DefaultViewModel>("home-json", new MediaTypeHeaderValue("text/json"), new MediaTypeHeaderValue("application/json")));
        GlobalConfiguration.Configuration.Formatters.Add(new RazorViewFormatter<DefaultViewModel>("home", new MediaTypeHeaderValue("text/html")));
        GlobalConfiguration.Configuration.Formatters.Add(new RazorViewFormatter<IEnumerable<CategoryViewModel>>("categories-json", new MediaTypeHeaderValue("text/json"), new MediaTypeHeaderValue("application/json")));
        GlobalConfiguration.Configuration.Formatters.Add(new RazorViewFormatter<IEnumerable<CategoryViewModel>>("categories", new MediaTypeHeaderValue("text/html")));

デフォルトのリソースにリクエストを送信すると、正しく解析された Razor ビューが返されます。

GET http://localhost:56071/api/ HTTP/1.1
User-Agent: Fiddler
Accept: text/json
Host: localhost:56071

ただし、カテゴリ リソースにリクエストを行うと、解析されたテンプレートではなく、モデルのシリアル化された json が返されます。カスタム メディア フォーマッタのマークが本質的に欠落しています。WriteToStreamAsync() が呼び出されることはありません

GET http://localhost:56071/api/categories HTTP/1.1
User-Agent: Fiddler
Accept: text/json
Host: localhost:56071

これは実行可能なアプローチではありませんか?私は CanReadType で一致を取得します。複数のフォーマッタと conneg の評価方法が何らかの形で text/json と一致しないのではないかと考えています。

どんな考えでも大歓迎です。ありがとう。

アップデート

public override bool CanWriteType(Type type)
{
    return (type == typeof (T) || type.IsSubclassOf(typeof (T)));
}

public override bool CanReadType(Type type)
{
    return false;
}
4

0 に答える 0