HttpClient Head 请求参数始终为 null

HttpClient Head request argument always null

我正在构建一个将用于应用程序更新的 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() 收到此回复)

根据 parameter binding rules,Web API 仅从 URI 获取 "simple" 类型(字符串、整数、日期时间等)的值,Version 不他们之中。我不相信使用 [FromUri] 属性会起作用,因为 Version 是不可变的(只读属性)所以我认为 Web API 不知道如何绑定它。

所以我认为您唯一的选择是 implement a custom type converter,它允许您明确告诉框架如何将字符串转换为 System.Version,或者如果您仅在几个动作,保持简单并使用字符串参数类型,并在动作中使用 Version.TryParse