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

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

Я написал клиент для использования приложения, но у меня есть некоторые проблемы с передачей объекта версии в запросе, у меня есть следующее для запроса 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() как предложено)

1 ответ

Решение

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

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

Другие вопросы по тегам