Asp.net mvc 4 如何使用内置的内容类型协商并直接访问决策

Asp.net mvc 4 如何使用内置的内容类型协商并直接访问决策,asp.net-mvc-4,asp.net-web-api,content-negotiation,Asp.net Mvc 4,Asp.net Web Api,Content Negotiation,我想利用内置的内容协商器,直接决定使用什么格式化程序。我不想使用Request.Headers.Accept并检查它是json还是xml内容类型,因为这个决定涉及很多事情。是否有一种方法可以在控制器级别检查或重写任何告诉我将使用什么格式化程序或请求内容类型的类 提前感谢。如果您想查看正在进行的操作,请安装TraceWriter,您将看到conneg的功能 TraceWriter看起来像: public class TraceWriter : ITraceWriter {

我想利用内置的内容协商器,直接决定使用什么格式化程序。我不想使用Request.Headers.Accept并检查它是json还是xml内容类型,因为这个决定涉及很多事情。是否有一种方法可以在控制器级别检查或重写任何告诉我将使用什么格式化程序或请求内容类型的类


提前感谢。

如果您想查看正在进行的操作,请安装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);
        }
    }
如果要手动调用conneg,则可以使用

     config.Services.GetContentNegotiator().Negotiate(...)

您可以手动运行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

Tugberk对这件事有自己的看法。看看。

谢谢菲利普。为什么我不能在配置中获取服务对象引用?我在intellisense中看不到。您使用的是Web API RC吗?服务是System.Web.Http.HttpConfigurationI的公共属性。我安装了ASP.NET MVC 4。ASP.NET Web API是该安装包的一部分。谢谢。我已经尝试过该代码,但我无法获得配置的Servics对象引用。我甚至看不到他们的智慧。我正在使用ASP.NETMVC4。
//the valid media type
var mediaType = connegResult.MediaType;
//do stuff

//the relevant formatter
var formatter = connegResult.Formatter;
//do stuff