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")));

向我的默认资源发出请求,返回正确解析的剃刀视图。

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 的方式是否最终以某种方式与文本/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