2

我正在构建一个用于应用程序更新的 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()按照建议使用)

4

1 回答 1

1

根据参数绑定规则,Web API 仅从 URI 中获取“简单”类型(字符串、int、DateTime 等)的值,Version不在其中。我不相信使用该[FromUri]属性会起作用,因为Version它是不可变的(只读属性),所以我认为 Web API 不知道如何绑定它。

所以我认为你唯一的选择是实现一个自定义类型转换器,它允许你明确告诉框架如何将字符串转换为 a System.Version,或者如果你只在几个动作中使用它,保持简单并使用一个字符串参数类型,并Version.TryParse在动作内部使用。

于 2015-08-17T11:34:51.700 回答