2012-07-10 32 views
3

我想利用內置的內容談判器,並且只需獲得決定要使用哪種格式化器的權限。我不想使用Request.Headers.Accept,並檢查它是否是json或xml內容類型,因爲該決定涉及很多事情。有沒有一種方法可以在控制器級別檢查或覆蓋任何告訴我要使用哪種格式化程序的類或什麼請求內容類型?如何使用內置的內容類型協商並且只需訪問決策

在此先感謝。

回答

0

如果你想看看發生了什麼,然後安裝一個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(...) 
2

你可以手動運行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 
+0

謝謝菲利普。爲什麼我無法在配置中獲得服務對象引用?我沒有在intellisense中看到它。 – user1186065 2012-07-10 21:27:49

+0

您使用的是Web API RC嗎?服務是System.Web.Http.HttpConfiguration的公共屬性 – 2012-07-10 21:44:26

+0

我確實安裝了ASP.NET MVC 4. ASP.NET Web API是該安裝包的一部分。 – user1186065 2012-07-11 14:14:25

0

Tugberk對這個blog。看一看。

+0

謝謝。我已經嘗試過這段代碼,但是一些我無法獲得配置的Servics對象引用。我甚至沒有在智能上看到他們。我正在使用ASP.NET MVC 4。 – user1186065 2012-07-11 17:35:31