【问题标题】:how to use built-in content type negotiation and just get access to the decision如何使用内置的内容类型协商并获得决策权
【发布时间】:2012-07-10 20:29:08
【问题描述】:

我想利用内置的内容协商器来决定要使用的格式化程序。我不想使用 Request.Headers.Accept 并检查它是 json 还是 xml 内容类型,因为该决定涉及很多事情。有没有办法可以在控制器级别检查或覆盖任何告诉我将使用什么格式化程序或请求内容类型是什么的类?

提前致谢。

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api content-negotiation


    【解决方案1】:

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

    【讨论】:

    • 谢谢菲利普。为什么我无法在配置中获取服务对象引用?我没有在智能感知中看到它。
    • 您在使用 Web API RC 吗? Services 是 System.Web.Http.HttpConfiguration 的公共属性
    • 我确实安装了 ASP.NET MVC 4。ASP.NET Web API 是该安装包的一部分。
    【解决方案2】:

    如果您想查看发生了什么,请安装 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(...)
    

    【讨论】:

      【解决方案3】:

      Tugberk 对此有一个blog。看看吧。

      【讨论】:

      • 谢谢。我已经尝试过该代码,但有些我无法获得配置的服务对象引用。我什至没有在智能感知中看到它们。我正在使用 ASP.NET MVC 4。
      猜你喜欢
      • 2015-08-06
      • 2018-07-07
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多