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;
}