我想利用内置的内容协商器,只需访问就可以决定要使用什么格式化程序。我不想使用Request.Headers.Accept来检查它是json还是xml内容类型,因为这个决定涉及到很多事情。有没有一种方法可以在控制器级别检查或覆盖任何类,告诉将使用什么格式化程序或什么是请求内容类型?
提前谢谢。
您可以手动运行conneg:
var conneg = Configuration.Services.GetContentNegotiator();
var connegResult = conneg.Negotiate(
typeof(YOUR_TYPE), Request, Configuration.Formatters
);
并以任何方式使用输出:
//the valid media type
var mediaType = connegResult.MediaType;
//do stuff
//the relevant formatter
var formatter = connegResult.Formatter;
//do stuff
如果你想看看发生了什么,那么安装一个TraceWriter,你就会看到conneg的作用。
TraceWriter看起来像:
public class TraceWriter : ITraceWriter {
public bool IsEnabled(string category, TraceLevel level) {
return true;
}
public void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction) {
var rec = new TraceRecord(request, category, level);
traceAction(rec);
Log(rec);
}
private void Log(TraceRecord record) {
Console.WriteLine(record.Message);
}
}
并且是这样安装的,
config.Services.Replace(typeof(ITraceWriter), new TraceWriter());
如果你想手动调用conneg,那么你可以使用,
config.Services.GetContentNegotiator().Negotiate(...)
Tugberk有一个关于这方面的博客。看一看