2013-02-20 21 views
3

在WebAPI服務中,我們使用Formatter來讀取請求上的內容參數。我們需要訪問該網址才能正確轉換內容參數。 HttpRequestMessage不可用,並且我們不能使用HttpContext.Current.Request,因爲HttpContext.Current爲null。在http://aspnetwebstack.codeplex.com/workitem/82上請求讀取訪問HttpRequestMessage,但由於HttpContent在Read上可用,因此此問題已關閉。但是,我不知道如何從HttpContent獲取URL,或者即使可能。在WebAPI格式化程序中,如何從HttpContent獲取URL?

回答

2

有一上,你可以重寫以創建格式化的新實例大約在它請求的狀態信息的格式稱爲GetPerRequestFormatterInstance方法。順便說一句,此方法GetPerRequestFormatterInstance只在請求的反序列化階段被調用。下面的示例:

public class TextPlainFormatter : BufferedMediaTypeFormatter 
{ 
    public TextPlainFormatter() 
    { 
     this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); 
    } 

    public HttpRequestMessage CurrentRequest 
    { 
     get; 
     private set; 
    } 

    public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType) 
    { 
     TextPlainFormatter frmtr = new TextPlainFormatter(); 
     frmtr.CurrentRequest = request; 

     //Copy from the original formatter instance to the new instance 
     frmtr.MediaTypeMappings.Clear(); 
     foreach (MediaTypeMapping mediaTypeMapping in this.MediaTypeMappings) 
     { 
      frmtr.MediaTypeMappings.Add(mediaTypeMapping); 
     } 

     frmtr.RequiredMemberSelector = this.RequiredMemberSelector; 

     frmtr.SupportedEncodings.Clear(); 
     foreach (Encoding supportedEncoding in this.SupportedEncodings) 
     { 
      frmtr.SupportedEncodings.Add(supportedEncoding); 
     } 

     frmtr.SupportedMediaTypes.Clear(); 
     foreach (MediaTypeHeaderValue supportedMediaType in this.SupportedMediaTypes) 
     { 
      frmtr.SupportedMediaTypes.Add(supportedMediaType); 
     } 

     return frmtr; 
    } 
+2

感謝您的答覆。如果您的格式化程序正在用於傳出響應,此技術可行,但不幸的是,如果您的格式化程序正在用於傳入請求,則此方法無效。 – 2013-02-23 14:19:15

+1

事實上的Web API的運行時呼籲,因爲我在上面的文章中提到的傳入請求(反序列化)GetPerRequestFormatterInstance方法。 – 2013-02-23 19:04:23

+0

這對我有用,謝謝。 – quakkels 2013-06-17 18:33:37

相關問題