2015-08-13 135 views
2

我正在構建將用於應用程序更新的WebAPI服務,我寫了一個HEAD和GET方法,它們都帶有一個Version對象,它表示客戶端升級到的版本。HttpClient頭請求參數始終爲空

我已經寫了一個客戶端使用,但必須通過的版本對象請求一些問題的應用程序,我已在爲HEAD請求

var httpClient = this.CreateHttpClient(this.ServiceBaseAddress, handler); 
httpClient.DefaultRequestHeaders.Accept.Clear(); 
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); 

JsonSerializerSettings settings = new JsonSerializerSettings 
             { 
              NullValueHandling = NullValueHandling.Ignore 
             }; 
var serializedVersion = JsonConvert.SerializeObject(version, settings); 

var requestUri = string.Format(
    "{0}{1}/?version={2}", 
    this.ServiceBaseAddress, 
    this.AddressSuffix, 
    serializedVersion); 

var request = new HttpRequestMessage(HttpMethod.Head, requestUri); 
if (from.HasValue) 
{ 
    request.Headers.Range = new RangeHeaderValue(from, to); 
} 
var response = await httpClient.SendAsync(request); 

當我調試如下現在。到達服務方法斷點但version參數總是null,服務方法簽名低於

public async Task<HttpResponseMessage> Head(Version version) 
{ 
... 
} 

誰能解釋什麼,我做錯了什麼?

編輯: 做了一些更多的分析,我得到了415服務器不支持的媒體類型響應。我添加了httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");但沒有區別,有什麼想法? (注意:我收到上述響應,或者按照建議使用version.ToString()

+0

檢查到達您的服務器的實際Url並查看版本查詢參數是否存在。 –

+0

And ... Btw ... Json序列化對象不適合查詢字符串參數。他們往往有各種非法角色。怎麼樣version.ToString()呢? –

回答

1

根據parameter binding rules,Web API只從「simple」類型(string,int,DateTime等)的URI獲取值, Version不在其中。我不相信使用[FromUri]屬性可以工作,因爲Version是不可變的(只讀屬性),所以我不認爲Web API會知道如何綁定它。

因此,我認爲你唯一的選擇將是implement a custom type converter,它允許你明確地告訴框架如何將一個字符串轉換爲System.Version,或者如果你只是一對夫婦的行動,使用它,保持它的簡單和使用字符串參數類型,並在動作中使用Version.TryParse