我想利用内置的内容协商器,并且可以决定使用什么格式化程序。我不想使用 Request.Headers.Accept 并检查它是 json 还是 xml 内容类型,因为该决定涉及很多事情。有没有办法可以在控制器级别检查或覆盖任何告诉我将使用什么格式化程序或请求内容类型是什么的类?
提前致谢。
我想利用内置的内容协商器,并且可以决定使用什么格式化程序。我不想使用 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 对此有一个博客。看一看。