Аргумент запроса HttpClient Head всегда равен нулю

Я создаю службу WebAPI, которая будет использоваться для обновлений приложений. У меня есть написанные методы HEAD и GET, которые оба принимают объект версии, который обозначает версию, до которой обновляется клиент.

Я написал клиент для использования приложением, но у меня есть некоторые проблемы с передачей объекта версии в запросе, у меня есть следующее для запроса 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 Unsupported Media Type. Я добавил httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");, но это не имеет значения, есть идеи? (ПРИМЕЧАНИЕ: я получаю этот ответ либо с приведенным выше, либо с использованием version.ToString(), как было предложено)


person Neil Stevens    schedule 13.08.2015    source источник
comment
Проверьте фактический URL-адрес, который достигает вашего сервера, и посмотрите, существует ли параметр запроса версии.   -  person Mihai Caracostea    schedule 14.08.2015
comment
И... Кстати... Сериализованные объекты Json не являются хорошими кандидатами на параметры строки запроса. Они, как правило, имеют всевозможные незаконные символы. Как насчет версии.ToString() вместо этого?   -  person Mihai Caracostea    schedule 14.08.2015


Ответы (1)


Согласно правила привязки параметров, веб-API получает значения из URI только для «простых» типов (string, int, DateTime и т. д.), Version не входящих в их число. Я не верю, что использование атрибута [FromUri] также будет работать, потому что Version является неизменяемым (свойства только для чтения), поэтому я не думаю, что веб-API знает, как его связать.

Поэтому я думаю, что единственными вашими вариантами будут реализовать пользовательский преобразователь типов, который позволяет вам явно указать фреймворку, как преобразовать строку в System.Version, или, если вы используете его только в нескольких действиях, сделайте его простым и используйте строковый тип параметра, а также используйте Version.TryParse внутри действия.

person Todd Menier    schedule 17.08.2015