HttpClient Head请求参数始终为null

时间:2015-08-13 21:01:46

标签: c# asp.net-web-api httpclient http-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 个答案:

答案 0 :(得分:1)

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

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